Perl6是否支持与Perl5'等价的东西;s数据段和结束段?

Perl6是否支持与Perl5'等价的东西;s数据段和结束段?,perl,raku,rakudo,Perl,Raku,Rakudo,perl6/Rakudo是否有与perl5的\uuuuu数据\uuuuuuuu或\uuuu结束\uuuuuuu部分等效的内容?引用: 类型名为的命名Perldoc块 数据是Perl 6与 Perl 5\uuuuuuuuuuuuuuuuuuu部分。这个 区别在于=数据块是 只是普通的豆荚块,可能会出现 源文件中的任意位置,以及 根据需要多次。 描述新的Perl 6接口 内联数据 从理论上讲,您应该能够执行类似的操作(如果关闭,请有人修复语法): Rakudo还不支持这一点。仔细地有选择地引用当前的

perl6/Rakudo是否有与perl5的
\uuuuu数据\uuuuuuuu
\uuuu结束\uuuuuuu
部分等效的内容?

引用:

类型名为的命名Perldoc块 数据是Perl 6与 Perl 5
\uuuuuuuuuuuuuuuuuuu
部分。这个 区别在于=数据块是 只是普通的豆荚块,可能会出现 源文件中的任意位置,以及 根据需要多次。 描述新的Perl 6接口 内联数据

从理论上讲,您应该能够执行类似的操作(如果关闭,请有人修复语法):


Rakudo还不支持这一点。

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

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

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

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

因此,您可以在脚本文件中定义任意数量的Pod块,而不是通过读取文件句柄来访问每个文件的单个数据部分;它们在编译时存储在
$=pod
变量中;你从变量中读取;被称为“数据”的是Perl5的数据的等价物

这在今天起作用。我马上就给你看。但首先我需要谈谈今天不起作用的东西

上面的引述是高度选择性的。省略的文本谈到P6自动创建一个名为
$=foo
的变量,对应于名为“foo”的Pod块。这是Pod块的一个尚未实现的通用特性,而不仅仅是数据块

Pod设计文档中的“数据块”部分讨论了数据块做一些比普通的旧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
  }
};

作为一种解决方法,在完全实现之前,您可以使用heredocs

for data().lines -> $line {
    put $line;
}

sub data {
    return q:to/END/;
           Foo, bar, baz
           1, 2, 3
           END
}
输出


要获取数据数组,同时将数据放在程序底部以帮助提高可读性,以下是@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
         )
}

不幸的是,Rakudo尚未实现这些功能。截至2016年底,Rakudo支持的功能如所示。一个阵列中有三个heredocs。美好的谢谢你提起这件事。它让我想起了我对哈希所做的类似工作(试图模仿Perl5)。
Foo, bar, baz
1, 2, 3
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
         )
}