Perl6 поддерживает что-то, эквивалентное __data __data __ и __end__?

StackOverflow https://stackoverflow.com/questions/4269140

  •  28-09-2019
  •  | 
  •  

Вопрос

У Perl6 / Rakudo есть что-то эквивалентное Perl5's __DATA__ или __END__ Разделы?

Это было полезно?

Решение

Цитировать S26.:

По именованным блокам Perldoc, чьи типичные значения являются данными, являются эквивалентом Perl 6 Perl 5 __DATA__ раздел. Разница в том, что = блоки данных являются просто обычными блоками POD и могут появиться в любом месте в исходном файле, и столько раз, сколько требуется. Синопсис 2.Описывает новый интерфейс Perl 6 для встроенных данных.

Теоретически вы должны иметь возможность сделать что-то вроде этого (кто-то, пожалуйста, исправьте синтаксис, если он выключен):

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;

На практике это кажется То, что Rakudo еще не поддерживает это.

Другие советы

Тщательно выборочно процитировать текущий S02. Документ дизайна:

Нет ни одного специального потока данных - любой блок POD в текущем файле может быть доступен через объект POD ...

Вы должны разделить [POD Block] содержимое в строки самостоятельно.

SUMPLATIVE] Также может быть возможность лечить объект POD в качестве ручки IO ::, чтобы прочитать строку информации POD (например, файл файлов данных в Perl 5, но для любого блока POD).

Итак, вместо одного ДАННЫЕ Секция на файл, который вы получаете, чтение файлов, вы определяете любое количество блоков POD в файле сценария; Они хранятся в $=pod переменная во время компиляции; вы читаете из этой переменной; И те, которые называются «данными», являются эквивалентами Perl 5 ДАННЫЕ.

Это работает сегодня. Я покажу это в мгновение. Но сначала мне нужно поговорить о вещах, которые не работают сегодня.

Цитирование выше было очень селективным. Усознанный текст говорил о P6 автоматически создает переменную с именем формы $=foo Соответствующие блокам POD с именем 'foo'. Это общее до сих пор нерепленная особенность блоков POD, а не только блоки данных.

Раздел «Блок данных» в Doc Document POD S26. Переговоры о блоках данных, выполняющих некоторые фаршированные вещи, чем простые старые блоки POD. Это еще не было реализовано.

Итак, теперь давайте перейдем к тому, что можно сделать сегодня:

=foo This is a Pod block. A single line one. This Pod block's name is 'foo'.

=begin qux
This is another syntax for defining a Pod block.
It allows for multi line content.
This block's name is 'qux'.
=end qux

=data A data block -- a Pod block with the name 'data'.

# Data blocks are P6's version of P5's __DATA__.
# But you can have multiple data blocks:

=begin data
Another data block.
This time a multi line one.
=end data

$=pod.grep(*.name eq 'data').map(*.contents[0].contents.say);

Это отпечатки:

A data block -- a Pod block with the name 'data'.
Another data block. This time a multi line one.

Итак, это работает сорта. Но это явно нужно намного больше сахара.

Кстати, если последняя линия стиля FP не имеет смысла, вот императивный эквивалент:

for @$=pod {
  if .name eq 'data' {
    say .contents[0].contents
  }
};

Как работа - вокруг, пока это не будет полностью реализовано, вы можете использовать Heredocs.

for data().lines -> $line {
    put $line;
}

sub data {
    return q:to/END/;
           Foo, bar, baz
           1, 2, 3
           END
}

Выходы

Foo, bar, baz
1, 2, 3

Чтобы получить массив данных, при этом внизу данные внизу программы, чтобы помочь с читаемостью, вот вариант @christopher Bottens Review:

my @txts = data();
dd @txts;
# this works too
my %stuff = hashdata();
dd %stuff;

# a lot of lines

sub data() {
    return ( q:to/LINE1/,
        Phasellus dictum, nunc id vestibulum rhoncus, mauris massa tempus nibh, 
        nec tincidunt nisi tellus et arcu. Phasellus vulputate consectetur
        vulputate. Quisque viverra commodo velit ac tincidunt. Nulla et est sem.
        Mauris gravida, nulla rutrum pharetra dapibus, eros velit feugiat nibh,
        nec iaculis purus urna ut diam. Praesent molestie felis a turpis gravida
        placerat. Duis sagittis pulvinar risus non aliquet. Nunc quis purus
        tempor, mattis nunc eu, porta ligula. Suspendisse dictum sit amet urna
        dapibus suscipit.  
        LINE1  
        q:to/LINE2/,  
        Praesent molestie felis a turpis gravida
        placerat. Duis sagittis pulvinar risus non aliquet. Nunc quis purus
        tempor, mattis nunc eu, porta ligula. Suspendisse dictum sit amet urna
        dapibus suscipit.
        LINE2
        q:to/LINE3/);
        Quisque viverra commodo velit ac tincidunt. Nulla et est sem.
        Mauris gravida, nulla rutrum pharetra dapibus, eros velit feugiat nibh,
        nec iaculis purus urna ut diam. Praesent molestie felis a turpis gravida
        placerat.
        LINE3
}

sub hashdata() { # a hash works too.
      return ( 'p' => q:to/PDATA/,
        Some multiline data
        in some lines
        PDATA

        'q' => q:to/QDATA/,
           More data in 
           multiple lines
           QDATA

         'r' => q:to/RDATA/
              Note that indentation depends on the position of the 
              ending token.
              Also, the punctuation following the regex is the punctuation
              following the expression. So a comma after each of the 
              p and q, but not needed after the r
              RDATA
         )
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top