2014-10-19 440 views
0

我是Perl的新手,並正在爲此而苦苦掙扎。我如何使下面的代碼迭代asterisk_Output for循環的每次運行?目前,它在for循環的第一次迭代中完成while循環,但不在後續循環中完成。Perl while while循環只在for循環中循環一次

open(asterisk_Output, "/usr/sbin/asterisk -rx \"sip show registry\"|") or die $!; 
foreach (@monitor_trunks){ 
    while (my $line = <asterisk_Output>) { 
     #Perform some action... Such as comparing each line. 
    } 
} 

我有它的工作的唯一途徑是通過把內部的頂線環,但是這是聯合國需要做出的外部命令多次調用。

+0

什麼是@ monitor_trunks?這與外部命令有關嗎? – 2014-10-19 20:57:05

+0

查看http://stackoverflow.com/questions/12043592/perl-re-reading-from-already-read-filehandle – 2014-10-19 20:57:47

+0

@martinclayton鑑於文件句柄是從外部命令輸出而不是文件,該解決方案將可能會返回非法尋求。 – Miller 2014-10-19 21:34:54

回答

1

在第一次循環結束時,文件指針位於文件末尾。如果你需要另一輪,你必須把它帶回來。

你可以嘗試要麼退文件:

seek(asterisk_Output,0,1); 

或者(如果你的邏輯允許的話)來改變foreachwhile(這樣你只能讀一次):

while (my $line = <asterisk_Output>){ 
    foreach (@monitor_trunks) { 
     #Perform some action... Such as comparing each line. 
    } 
} 

第三種方法是將整個文件讀入一個數組並將其用作循環的輸入:

@array = <asterisk_Output>; 

foreach (@monitor_trunks){ 
    for my $line (@array) { 
    #Perform some action... 
    } 
} 
+3

鑑於文件句柄是外部命令的輸出,我期望您的第一個選項將返回非法查找。因此,第二或第三是我的建議。 – Miller 2014-10-19 21:32:22