Подтвердить что ты не робот

Поддерживает ли Perl6 что-то, что эквивалентно разделам Perl5 __DATA__ и __END__?

Имеет ли perl6/Rakudo что-то, что соответствует разделам perl5 __DATA__ или __END__?

4b9b3361

Ответ 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