Perl6是否支持与Perl5的__DATA__和__END__部分相同的内容?

sid*_*com 14 perl rakudo perl6 raku

perl6/Rakudo是否有相当于perl5 __DATA____END__部分的东西?

zou*_*oul 12

引用S26:

类型名为DATA的命名Perldoc块是Perl 5等效的Perl 5 __DATA__部分.区别在于= DATA块只是常规Pod块,可能出现在源文件中的任何位置,并且可以根据需要多次出现.概要2 描述了用于内联数据的新Perl 6接口.

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

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,Rakudo还没有实现它们. (4认同)

rai*_*iph 12

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

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

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

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

因此,不是通过读取文件句柄访问每个文件的单个DATA部分,而是在脚本文件中定义任意数量的Pod块; 它们$=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);
Run Code Online (Sandbox Code Playgroud)

这打印:

A data block -- a Pod block with the name 'data'.
Another data block. This time a multi line one.
Run Code Online (Sandbox Code Playgroud)

所以,它有点有效.但它显然需要更多的糖.

顺便说一句,如果最后一个FP风格的行没有意义,这是一个必要的等价物:

for @$=pod {
  if .name eq 'data' {
    say .contents[0].contents
  }
};
Run Code Online (Sandbox Code Playgroud)