2014-10-19 230 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