Поддерживает ли Perl6 что-то эквивалентное разделам Perl5 __DATA__ и __END__? - PullRequest
14 голосов
/ 24 ноября 2010

Есть ли в perl6 / Rakudo что-то эквивалентное разделам perl5 __DATA__ или __END__?

Ответы [ 4 ]

12 голосов
/ 24 ноября 2010

Цитата S26 :

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

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

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;

На практике кажется, что Ракудо это пока не поддерживает.

11 голосов
/ 14 января 2015

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

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

Вы должны разбить содержимое [Pod-блока] на строки самостоятельно.

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

Таким образом, вместо одного раздела DATA файл, к которому вы обращаетесь, читая дескриптор файла, вы определяете любое количество блоков Pod в вашем файле скрипта;они хранятся в переменной $=pod во время компиляции;вы читаете из этой переменной;и те, что называются «data», являются эквивалентами Perl 5 DATA .

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

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

Раздел «блоки данных» в документации Pod посвящен S26 , в котором говорится о том, что блоки данных делают более причудливые вещи, чем простостарые блоки под.Это еще не реализовано.

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

=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
  }
};
3 голосов
/ 13 августа 2018

Чтобы получить массив данных, поместив данные в нижней части программы для удобства чтения, вот вариант ответа @Christopher Bottoms:

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
         )
}
3 голосов
/ 10 августа 2017

В качестве обходного пути до полной реализации вы можете использовать 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
...