16

perl6/Rakudo には perl5__DATA____END__セクションに相当するものはありますか?

4

4 に答える 4

14

引用S26

__DATA__タイプ名がDATAである名前付きPerldocブロックは、Perl5セクションに相当するPerl6です。違いは、= DATAブロックは単なる通常のポッドブロックであり、ソースファイル内のどこにでも、必要な回数だけ表示される可能性があることです。概要2では 、インラインデータ用の新しいPerl6インターフェースについて説明しています。

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

use v6;

=begin DATA
Foo
=end DATA

say @=DATA;

実際には、Rakudoはまだそれをサポートしていないようです。

于 2010-11-24T16:54:14.300 に答える
13

現在のS02設計ドキュメントを慎重に選択して引用するには:

特別な DATA ストリームはなくなりました。現在のファイル内の任意の Pod ブロックは、Pod オブジェクトを介してアクセスできます ...

[Pod ブロック] の内容を自分で行に分割する必要があります。

[投機的] Pod オブジェクトを IO::Handle として扱い、Pod 情報を行単位で読み取ることも可能です (Perl 5 の DATA ファイルハンドルと同様ですが、任意の Pod ブロックに対して)。

したがって、ファイルハンドルを読み取ってアクセスするファイルごとに 1 つのDATAセクションの代わりに、スクリプト ファイルで任意の数の Pod ブロックを定義します。$=podそれらはコンパイル時に変数に格納されます。その変数から読み取ります。'data' と呼ばれるものは、Perl 5 のDATAに相当します。

これは今日動作します。すぐにそれを示します。しかし、まず、今日うまくいかないことについて話す必要があります。

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

Pod design doc 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
  }
};
于 2015-01-14T06:16:36.000 に答える