打开数组中每个元素的文件,并检查正则表达式Perl

时间:2013-11-17 15:59:24

标签: regex arrays perl io

我有一个数组,里面填充了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,所以对我在这里遗漏的内容有任何详细的解释 将不胜感激。

3 个答案:

答案 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来揭示数组的内容。