Tie :: Fileを__DATA__に使用すると予期しない動作が発生する

古い質問に巧みなやり方で答えようとすると、成功するかどうかを知らずに、これを試みようとしていました。

#!/usr/bin/env perl

use strict;
use warnings;

use Tie::File;
tie( my @data, 'Tie::File', \*DATA ) or die "Cannot tie DATA";

foreach ( @data ) {
    print;
}

foreach ( @data ) {
    print scalar reverse;
}


__DATA__
one
two
three
four
five
six

私はそれが働くこと、または死ぬことを期待しました。私が得たものは予想外でした。

#!/usr/bin/env perluse strict;use warnings;use Tie::File;tie( my @data, 'Tie::File', \*DATA ) or die "Cannot tie DATA";foreach ( @data ) {    print;}foreach ( @data ) {    print scalar reverse;}__DATA__onetwothreefourfivesixlrep vne/nib/rsu/!#;tcirts esu;sgninraw esu;eliF::eiT esu;"ATAD eit tonnaC" eid ro ) ATAD*\ ,'eliF::eiT' ,[email protected] ym (eit{ ) [email protected] ( hcaerof;tnirp    }{ ) [email protected] ( hcaerof;esrever ralacs tnirp    }__ATAD__enoowteerhtruofevifxis

どのように __ DATA __ Tie :: File に結び付けようとしていたのですが、それはスクリプトを結びつけ、 chomp

3

1 答え

DATA ファイルハンドルは、それを参照するファイルのオープンファイルハンドルです。プログラムを最初に読み込んだときに、プログラムの __ DATA __ トークンまたは __ END __ トークンの後ろの最初のバイトを検索して、 。

* DATA を結ぶと、最初に読み込まれた魔法の邪魔になり、ファイルの先頭にあるソースファイルのハンドルが得られます。

data を最初に(または DATA <0,1 をシークする)ように呼び出すと、正しい位置と期待通りの「仕事」

4
追加された
見つけたまた、 chomp に関しては、そうでないと言っていない限り、 Tie :: File は自動チャンプを行います。
追加された 著者 Eric Strom,
@ジョエルバーガー - あなたは正しい。 Tie :: File の早い段階で seek $ file、0,0 の呼び出しがあります。バグレポートの価値があるかもしれませんか? :-)
追加された 著者 mob,
無敵のタグチームはすぐにそれを取得します。これは最高の奇妙さと最悪のバグだった。ありがとう。
追加された 著者 Joel Berger,
DATAの tell seek は役に立ちませんが、問題は解決されているはずです。 Tie :: File が最初に戻ってきて、どこかの中間にある seek されたオープンハンドルを結ぶと、
追加された 著者 Joel Berger,
@モブ、うーん、私はそれが何か良いことができるように感じることに同意しますが、私はそれが何であるか分からない。ファイルハンドルがDATAを指し示しているかどうか、あるいはDATAの魔法にフックする何らかの方法を検出する方法はありますか? Tie :: Array :: CSV をテストするために、 File :: Temp 一時ファイルに書き込んだ後、そのハンドルを結び付けます。 DATAを検出する方法があれば、おそらくそれが傍受されて使用される可能性があります。ここで __ DATA __ セクションの実装を隠してしまったのは面白いです。
追加された 著者 Joel Berger,
なぜ最近私はこのことを考えていたのか分かりませんが、それは馬鹿げた小さな声を聞きます: gist.github.com/2941467
追加された 著者 Joel Berger,