2010-10-29 36 views
7

perldoc perlvar,我這樣說的:如何告訴一個需要從特殊ARGV句柄中讀取文件的Perl函數?

注意,目前 「ARGV」 僅具有 「<>」 運營商內部 其神奇的效果;在其他地方,它只是一個簡單的 文件句柄,對應於由「<>」打開的最後一個 文件。特別是, 將「* ARGV」作爲參數傳遞給 函數,該函數預計文件句柄可能不會導致您的函數 自動讀取@ARGV中所有文件的內容。

那麼,如何可以我通過*ARGV(或一些類似於它)作爲一個參數設置爲期望一個文件句柄的功能,並具備該功能讀取@ARGV所有文件?

回答

12

繼續前進並通過*ARGV typeglob或\*ARGV,其參考。只要確保最終使用該功能的功能通過<$fh>運營商或readline($fh)(其基本功能等效)即可實現。

問題從perlvar手冊頁所引用段尋址只是想提醒你,你將無法得到ARGV魔力開放觸發,如果你使用任何其他閱讀機制比readline上句柄,例如read,sysreadgetc

運行這個來證明自己工作原理:

sub mycat { 
    my $fh = shift; 
    print "$ARGV $.: $_" while <$fh>; 
} 
mycat(*ARGV); 

假如把它放在一個文件,然後用幾個文件參數運行它:

% perl mycat ./mycat //`pwd`/mycat ~/mycat 
./mycat 1: sub mycat { 
./mycat 2:  my $fh = shift; 
./mycat 3:  print "$ARGV $.: $_" while <$fh>; 
./mycat 4: } 
./mycat 5: mycat(*ARGV); 
///home/tchrist/mycat 6: sub mycat { 
///home/tchrist/mycat 7:  my $fh = shift; 
///home/tchrist/mycat 8:  print "$ARGV $.: $_" while <$fh>; 
///home/tchrist/mycat 9: } 
///home/tchrist/mycat 10: mycat(*ARGV); 
/home/tchrist/mycat 11: sub mycat { 
/home/tchrist/mycat 12:  my $fh = shift; 
/home/tchrist/mycat 13:  print "$ARGV $.: $_" while <$fh>; 
/home/tchrist/mycat 14: } 
/home/tchrist/mycat 15: mycat(*ARGV); 

看到了嗎?它工作正常。

+1

呵呵。我閱讀本文後,我的程序開始工作。 – 2010-10-29 06:26:06

-1

你可以僞造它與cat(Unix系統)

open FAKE_ARGV, "cat @ARGV |"; 
function_expecting_filehandle(*FAKE_ARGV); 
... 

你失去了一些魔術($ARGV$.)與此有關。

我相信也有辦法處理一個綁定的文件句柄(請參閱perltie)。

1

遍歷一個重載的對象時,您可以重新分派到<>

{package ReadARGV; 
    sub new {bless []} 
    use overload '<>' => sub {<>}; 
} 

sub reader { 
    my $fh = shift; 
    local $_; 
    print while <$fh>; 
} 

reader(ReadARGV->new); 

ReadARGV包中包含一個簡單的對象構造new,然後重載<HANDLE>操作者只需撥打<>

相關問題