16

perl6/Rakudo 是否有与 perl5__DATA____END__部分等效的东西?

4

4 回答 4

14

引用S26

类型名称为 DATA 的命名 Perldoc 块是 Perl 6 中 Perl 5__DATA__部分的等价物。不同之处在于 =DATA 块只是普通的 Pod 块,可以出现在源文件中的任何位置,并且可以根据需要多次出现。概要 2 描述了用于内联数据的新 Perl 6 接口。

理论上你应该能够做这样的事情(如果它关闭,请有人修复语法):

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;

在实践中,Rakudo 似乎还不支持这一点。

于 2010-11-24T16:54:14.300 回答
13

仔细选择性地引用当前的S02设计文档:

不再有任何特殊的 DATA 流——当前文件中的任何 Pod 块都可以通过 Pod 对象访问...

您必须自己将 [Pod block] 内容拆分为行。

[推测] 也可以将 Pod 对象视为 IO::Handle,以逐行读取 Pod 信息(类似于 Perl 5 中的 DATA 文件句柄,但适用于任何 Pod 块)。

因此,您可以在脚本文件中定义任意数量的 Pod 块,而不是通过读取文件句柄来访问每个文件的单个DATA部分;它们$=pod在编译时存储在变量中;您从该变量中读取;那些称为 'data' 的是 Perl 5 的DATA的等价物。

这在今天有效。我稍后会展示。但首先我需要谈谈今天不起作用的东西。

上面的引用是高度选择性的。省略的文本谈到 P6 自动创建一个变量,其名称$=foo与名称为“foo”的 Pod 块相对应。这是 Pod 块的一般仍未实现的功能,而不仅仅是数据块。

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
  }
};
于 2015-01-14T06:16:36.000 回答
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
于 2017-08-10T11:14:04.103 回答
3

要获取数据数组,同时将数据放在程序的底部以帮助提高可读性,这是@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
         )
}
于 2018-08-13T06:55:12.493 回答