Имеет ли perl6/Rakudo что-то, что соответствует perl5's __DATA__
или __END__
разделы?Поддерживает ли Perl6 что-то, что соответствует разделам __DATA__ и __END__ Perl5?
ответ
Адрес S26:
Именованные Perldoc блоки которых является Ьурепате данные представляют собой Perl 6 эквивалент 5
__DATA__
секции Perl. Разница состоит в том, что = блоки DATA: просто обычные блоки Pod и могут отображаться в любом месте исходного файла, а также как много раз по мере необходимости. Synopsis 2 описывает новый интерфейс Perl 6 для встроенных данных .
В теории вы должны быть в состоянии сделать что-то вроде этого (кто-нибудь, пожалуйста, исправить синтаксис, если он выключен):
use v6;
=begin DATA
Foo
=end DATA
say @=DATA;
In practice it seems что Rakudo не поддерживает, что, тем не менее.
Тщательно выборочно процитировать текущий S02 дизайн документа:
Там больше нет какой-либо специальный поток данных - любой блок Pod в текущем файле можно получить с помощью объекта Pod ...
Вы должны разделить содержимое [Pod block] на линии самостоятельно.
[Спекулятив-] Он также может быть возможным, чтобы рассматривать объект Pod как IO :: Handle, чтобы прочитать информацию Под линию за линией (подобно дескриптор DATA в Perl 5, но для любого блока Pod).
Таким образом, вместо одного DATA раздела на файл, который вы получаете доступ на чтение дескриптора файла, можно определить любое количество Pod блоков в файле сценария; они сохраняются в переменной $=pod
во время компиляции; вы читаете из этой переменной; и те, которые называются «данными», являются эквивалентами Perl 5's DATA.
Это работает сегодня. Я покажу это мгновенно. Но сначала мне нужно поговорить о том, что сегодня не работает.
Приведенное выше было очень избирательным. В приведенном тексте говорилось о P6, автоматически создающем переменную с именем формы $=foo
, соответствующей блокам Pod с именем «foo». Это общая нереализованная функция блоков Pod, а не только блоков данных.
В разделе «Блок данных» документа Pod Design doc 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
К сожалению Rakudo не реализуют их еще. – moritz 2010-11-24 17:05:45