Perl6は、perl5の__data__および__end__セクションに相当するものをサポートしていますか?

StackOverflow https://stackoverflow.com/questions/4269140

  •  28-09-2019
  •  | 
  •  

質問

perl6/rakudoにはperl5に相当するものがありますか __DATA__ また __END__ セクション?

役に立ちましたか?

解決

引用 S26:

タイプネームがデータであるPerldocブロックという名前は、Perl 5に相当するPerl 6です __DATA__ セクション。違いは、=データブロックは通常のポッドブロックであり、ソースファイル内のどこにでも表示され、必要に応じて何度も表示される可能性があることです。 概要2インラインデータの新しいPerl 6インターフェイスについて説明します。

理論的には、このようなことができるはずです(誰かがオフになったら構文を修正してください):

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;

実際には、それは思われます Rakudoはまだそれをサポートしていません。

他のヒント

電流を慎重に選択的に引用します S02 デザインドキュメント:

特別なデータストリームはもうありません。現在のファイルのポッドブロックは、ポッドオブジェクトからアクセスできます...

ポッドブロック]内容物を自分で線に分割する必要があります。

投機的] PODオブジェクトをIO ::ハンドルとして扱い、POD情報のラインバイラインを読むことも可能かもしれません(Perl 5のデータファイルハンドルなど、ポッドブロックの場合)。

したがって、シングルの代わりに データ ファイルハンドルを読んでアクセスするファイルごとのセクションでは、スクリプトファイルに任意の数のポッドブロックを定義します。それらはに保存されます $=pod コンパイル時に変数。その変数から読みます。そして、「データ」と呼ばれるものは、Perl 5に相当するものです データ.

これは今日機能します。すぐにそれを見せます。しかし、最初に私は今日機能しないものについて話す必要があります。

上記の引用は非常に選択的でした。展開されたテキストは、フォームの名前を持つ変数を自動的に作成するP6について話しました $=foo 「foo」という名前のポッドブロックに対応します。これは、データブロックだけでなく、ポッドブロックのまだ実装されていない機能です。

ポッドデザインドキュメントの「データブロック」セクション S26 普通のポッドブロックよりもファンシーなことをしているデータブロックについて話します。これもまだ実装されていません。

それでは、今日できることに進みましょう。

=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
}

出力

Foo, bar, baz
1, 2, 3

データをプログラムの下部に置いて読みやすくするために、データを配置するために、 @christopherボトムズのバリエーションを次に示します。

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
         )
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top