3

在试图以一种聪明的方式回答一个老问题时,我打算这样做,但不知道它是否会成功:

#!/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它也绑定了?!

4

1 回答 1

4

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

当您 tie 时*DATA,您会妨碍首次读取魔法,并获得位于文件顶部的源文件句柄。

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

于 2011-10-27T20:46:27.647 回答