在__DATA__上使用Tie :: File时出现意外行为

时间:2011-10-27 20:38:30

标签: perl tie

在尝试以聪明的方式回答old question时,我打算尝试这一点,不知道它是否会成功:

#!/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' ,atad@ ym (eit{ ) atad@ ( hcaerof;tnirp    }{ ) atad@ ( hcaerof;esrever ralacs tnirp    }__ATAD__enoowteerhtruofevifxis

试图将__DATA__绑定到Tie::File并将其与脚本联系起来,以及chomp它也是如此?!

1 个答案:

答案 0 :(得分:4)

DATA文件句柄只是引用它的文件的打开文件句柄。它有一些额外的魔力,第一次读取它时,它会寻找程序中__DATA____END__标记之后的第一个字节,为您提供所期望的行为。

当你绑定*DATA时,你会妨碍第一次阅读魔法,并获得位于文件顶部的源文件的句柄。

我怀疑如果您在tell DATA之前先致电seek DATA,0,1(或者tie),它将处于正确的位置,并且像您预期的那样“工作”。