2014-06-17 32 views
0

我有一個程序,同時從一個測試文件的內容的管道獲取數據(cat file)。我通常使用鑽石算子從STDIN逐行獲取數據,直到最後一行。麻煩的是,我想重複使用多個子例程的相同數據。如何重置STDIN的讀數以便可以從第一行再次讀取數據?如何在STDIN完成後重置數據?

sub downloadsrt { 
    print "Printing list of subtitle files in downloadable form..\n"; 
    while (<>) { 
     chomp($_); 
     (my $fname,my $path, my $suffix) = fileparse($_); 
     $_=$fname; 
     my ($name, $ext) = $fname =~ /(.*)\.(.*)/; 
     #For srt 
     my $newfile=$path.$name.".$ext"; 
     $newfile =~ s/\s/%20/g; 
     $newfile =~ s/\/root/http:\/\/$localip/; 
     print $newfile."\n"; 
    } 
} 
sub dummysub { 
    while (<>) { 
     // Something else 
    } 
} 

downloadsrt; 
dummysub; 

我想使用多個子程序來訪問STDIN,每個應從STDIN的第一行中獲取數據。

除非我誤會這不是詞彙範圍。

+3

簡短的回答:你不能。但是,對於從STDIN讀取的每一行,您都可以將內容存儲在數組中,或者並行運行您的邏輯。 –

+0

['IO :: Mux'](https://metacpan.org/pod/IO::Mux),也許? – Zaid

回答

1

至於建議的@mpapec,你需要從標準輸入數據存儲到一個數組:

my @stdin = <>; 
mysub_1(\@stdin); 
mysub_2(\@stdin); 
+0

在將數組分配給數組之前,如何檢查'<>'是否保存了任何數據?否則,這裏的第一個命令會等待數據。 – Droidzone

+0

''''不是一個數據結構,而是一個I/O操作符,所以它不包含任何數據。考慮到你從'cat'命令獲得你的數據,它應該不會成爲一個問題,因爲你總是得到EOT(傳輸結束)字符。 – Pierre

相關問題