我写了一个脚本来匹配模式并返回一个文件的语句
#!/usr/bin/perl
use strict;
use warnings;
my $file = '/home/Sidtest/sid.txt';
open my $info , $file or die " Couldn't open the $file:$!";
while( my $line = <$info>) {
if ($line =~ m/^#LoadModule ssl_module/) {
print "FileName =",$file," Status = Failed \n";
}
elsif ($line =~ m/^LoadModule ssl_module/) {
print "FileName =",$file," Status = Passed \n";
}
}
close $info;
所以现在我正在尝试修改此脚本以适用于同一目录下的多个文件。我无法成功地做到这一点。任何人都可以帮助我如何使其适用于目录中的任意数量的文件。
答案 0 :(得分:1)
这将读取./directory
和foreach文件中的每个文件,打印出每一行。
可以将print语句更改为print if /match/
或任何您想要的内容:
my @dir = <directory/*>;
foreach my $file (@dir){
open my $input, '<', $file;
while (<$input>){
print "PASS: $_\n" if m/^#LoadModule ssl_module/;
[...]
}
}
答案 1 :(得分:0)
变量@ARGV
包含启动时发送到脚本的参数列表。循环遍历@ARGV
并使用您要处理的文件调用脚本:
#!/usr/bin/perl
use strict;
use warnings;
foreach my $file (@ARGV) {
open my $info , $file or die " Couldn't open the $file:$!";
while( my $line = <$info>) {
if ($line =~ m/^#LoadModule ssl_module/) {
print "FileName =",$file," Status = Failed \n";
}
elsif ($line =~ m/^LoadModule ssl_module/) {
print "FileName =",$file," Status = Passed \n";
}
}
close $info;
}
# process all files *.txt in your dir: ./myscript.pl /home/Sidtest/*.txt
答案 2 :(得分:0)
检查perldoc perlrun,并查看-p和-n参数。本质上,它们将您的脚本视为stdin循环的内容,其中stdin是通过迭代命令行上提供的文件生成的。可以使用$ ARGV变量访问当前正在处理的文件的名称。
所以,你可能会采用一种方法,你的整个脚本看起来更像这样,使用-n param,其中$ _包含当前行。:
if ( m/^#LoadModule ssl_module/) {
print "FileName =",$ARGV" Status = Failed \n";
} elsif (m/^LoadModule ssl_module/) {
print "FileName =",$ARGV," Status = Passed \n";
}