我正在尝试将cmd的输出写入文件并grep输出输出中的模式并将其推送到数组中(如果找到)。我在将输出写入文件时面临问题
以下代码不使用文件处理程序,数组工作正常并打印输出
my $output = `cmd to get output`;
print "output is : $output\n";
但是如果我将相同的代码放在文件处理程序中,那么它甚至不会打印硬编码的单词output is :
use warnings;
use strict;
use Data::Dumper;
foreach my $cfg_file (@cfg_files){
#open the file handler for both read and write mode
open my $fh1, '+>', 'c:\TEMP\cfg.txt' or die $!;
while ( <$fh1> ) {
my $output = `cmd to get output using $cfg_file`;
print "output is : $output\n";
print $fh1 $output; #write the output into file
if (/$pattern/) { #read the file for a specific pattern
print "$_";
push(@matching_lines, $_);
}
}
}
print Dumper(\@matching_lines);
代码甚至没有抛出警告。我得到的输出就是
$VAR1 = [];
答案 0 :(得分:2)
while (<$fh1>)
尝试从$fh1
文件句柄中读取。它根本没有任何东西,循环体永远不会被执行。顺便说一句,+>
首先破坏了文件,因此当代码到达while
时,文件确实是空的。
您可以放弃while
循环并针对您刚刚获得的变量$pattern
测试$output
。
open my $fh1, '+>', 'c:\TEMP\cfg.txt' or die $!;
my $output = `cmd to get output`;
print "output is : $output\n";
print $fh1 $output; #write the output into file
if ($output =~ /($pattern)/s) { # test and capture from output
print "$1\n";
push (@matching_lines, $1);
}
由于输出可能有多行,我们将/s
添加到正则表达式。
您的其余代码将是相同的。