2011-10-27 28 views
3

使用領帶::文件時,在試圖回答一個聰明的方法的old question,我要嘗試這個,不知道它是否會成功:意外行爲上__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太?

回答

4

DATA文件句柄只是指向它的文件的打開文件句柄。它有一些額外的魔力,第一次讀取它時,它尋找到程序中的__DATA____END__令牌後面的第一個字節,從而爲您提供期望的行爲。

當你連接*DATA時,你會遇到第一個讀取魔術的方法,並獲得位於文件頂部的源文件句柄。

我懷疑如果您在tie之前先撥打tell DATA(或者seek DATA,0,1),它會處於正確的位置,並且像您期望的那樣「工作」。

+2

現貨。除了'chomp','Tie :: File'也會自動chomping,除非你不告訴它。 –

+0

無與倫比的標籤團隊迅速獲得。這是最好的一個好奇,最壞的是一個錯誤。謝謝。 –

+0

DATA上的'tell'和'seek'不起作用,但我相信你有問題。我懷疑,如果你將一個打開的句柄綁定到某處,那麼'Tie :: File'首先會返回到開頭。 –