Имеет ли perl6/Rakudo что-то, что соответствует разделам perl5 __DATA__
или __END__
?
Поддерживает ли Perl6 что-то, что эквивалентно разделам Perl5 __DATA__ и __END__?
Ответ 1
Цитировать S26:
Именованные блоки Perldoc, чье имя DATA - это эквивалент Perl 6 Perl 5
__DATA__
. разница в том, что = блоки DATA просто регулярные блоки Pod и могут появляться в любом месте исходного файла и много раз по мере необходимости. Краткое описание 2описывает новый интерфейс Perl 6 для встроенные данные.
В теории вы должны быть способны сделать что-то вроде этого (кто-нибудь, пожалуйста, исправьте синтаксис, если он выключен):
use v6;
=begin DATA
Foo
=end DATA
say @=DATA;
На практике кажется, что Rakudo еще не поддерживает это.
Ответ 2
Чтобы тщательно выбрать текущий S02 проектный документ:
Больше нет никакого специального потока данных - любой блок Pod в доступ к текущему файлу можно получить через объект Pod...
Вам нужно разделить содержимое [Pod block] на строки.
[Спекулятивный] Также возможно обработать объект Pod как IO:: Handle, чтобы читать данные Pod по очереди (например, DATA filehandle в Perl 5, но для любого блока Pod).
Итак, вместо отдельного раздела DATA для каждого файла, к которому вы обращаетесь, читая дескриптор файла, вы определяете любое количество блоков Pod в вашем файле script; они сохраняются в переменной $=pod
во время компиляции; вы читаете из этой переменной; и те, которые называются "данными", являются эквивалентами Perl 5 DATA.
Это работает сегодня. Я покажу это мгновенно. Но сначала мне нужно поговорить о том, что сегодня не работает.
Вышеприведенное цитирование было очень избирательным. В приведенном тексте говорилось о P6, автоматически создающем переменную с именем формы $=foo
, соответствующей блокам Pod с именем "foo". Это общая нереализованная функция блоков Pod, а не только блоков данных.
Раздел "блок данных" документа Pod design doc S26 рассказывает о блоках данных, делающих некоторые более интересные вещи, чем простые старые блоки Pod, Это еще не реализовано.
Итак, теперь давайте перейдем к тому, что можно сделать сегодня:
=foo This is a Pod block. A single line one. This Pod block name is 'foo'.
=begin qux
This is another syntax for defining a Pod block.
It allows for multi line content.
This block name is 'qux'.
=end qux
=data A data block -- a Pod block with the name 'data'.
# Data blocks are P6 version of P5 __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
}
};
Ответ 3
Как работа, пока это не будет полностью реализовано, вы можете использовать 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