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

时间:2010-11-24 16:34:47

标签: perl perl6 rakudo raku

perl6 / Rakudo是否具有与perl5的__DATA____END__部分相同的内容?

4 个答案:

答案 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>