perl6 / Rakudo是否具有与perl5的__DATA__
或__END__
部分相同的内容?
答案 0 :(得分:12)
引用S26:
typename为的命名Perldoc块 DATA是Perl 6的等价物 Perl 5
__DATA__
部分。该 不同的是= DATA块是 只是常规的Pod块可能会出现 在源文件中的任何位置,以及 根据需要多次。 Synopsis 2 描述了新的Perl 6接口 内联数据。
从理论上讲,你应该可以做这样的事情(如果关闭,有人请修改语法):
use v6;
=begin DATA
Foo
=end DATA
say @=DATA;
In practice it seems但是Rakudo不支持这一点。
答案 1 :(得分:11)
要仔细选择性地引用当前的S02设计文档:
不再有任何特殊的数据流 - 任何Pod块 可以通过Pod对象访问当前文件...
您必须自己将[Pod block]内容拆分为行。
[推测]也可以将Pod对象视为 IO :: Handle,逐行读取Pod信息(如DATA Perl 5中的文件句柄,但对于任何Pod块)。
因此,不是通过读取文件句柄访问的每个文件的单个 DATA 部分,而是在脚本文件中定义任意数量的Pod块;它们在编译时存储在$=pod
变量中;你从那个变量中读取;而称为“数据”的那些是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
}
};
答案 2 :(得分: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
答案 3 :(得分:3)
要获取数据数组,同时将数据放在程序底部以提高可读性,这是@Christopher Bottoms答案的一种变体:
<tr>
<td><strong>Vamos a sentarnos.</strong></td>
<td><strong>Let's sit down.</strong></td>
</tr>
<tr>
<td>veamos (ver)</td>
<td>let's see (to see)</td>
</tr>