我有一个数组,里面填充了4位数字(@nums)
使用数字作为文件名的conf文件,如:0000.conf
我正在读取数组中的文件foreach
元素并进行检查
这样的模式的文件:
use strict;
use warnings;
foreach my $num (@nums) {
open my $fh, "<", "$num.conf"
or warn "cannot open $num.conf : $!";
while(<$fh>) {
if (/^SomePattern=(.+)/) {
print "$num : $1\n";
}
}
}
我正在使用()
提取我想要的模式部分
特殊var $1
。
这似乎有效,除了它只打印最后一个文件的结果 打开,而不是每次foreach循环打印结果 传递并打开一个文件,这就是我的预期。
我还在学习Perl,所以对我在这里遗漏的内容有任何详细的解释 将不胜感激。
答案 0 :(得分:1)
use v5.16;
use strict;
use warnings;
my @nums = qw/ 0000 0200 /;
for my $num (@nums){
open my $fh, "<", "$num.conf" or die;
while (<$fh>) {
chomp;
if( /^somePattern=(.+)/ ) {
say "$1";
}
}
close $fh;
}
这似乎对我有用..你错过了接近$ fh;在你的代码中,也许那是错的。其次,也许只有一个文件与你的正则表达式匹配,检查内容是否有拼写错误。我自己不使用foreach,也许你在$ num之前缺少'my'。根据你的正则表达式,使用'chomp'来修改行尾的换行符可能很有用。
答案 1 :(得分:1)
您的代码非常适合学习者。
问题是,使用"$num.conf"
,您尝试打开名为0.conf
等的文件,而不是0000.conf
。
您还应该在$!
字符串中使用die
的值,以便了解 开放失败的原因。
改为写
my $file = sprintf '%04d.conf', $num;
open my $fh, '<', $file or die "Unable to open '$file': $!";
答案 2 :(得分:0)
我已经离开了我之前的答案,因为它可能对某人有用。但是我错过了你的开场“我有一个充满4位数字的数组”。
毫无疑问,你错误地填充了你的阵列。
如果您正在阅读某个文件,那么大多数情况下您通常会忘记从您阅读过的行末尾chomp
换行。
每个数字中也可能包含不可打印的字符(通常是制表符或空格)。
您应该使用Data::Dumper
或更好和更新的Data::Dump
来揭示数组的内容。