首页 > 解决方案 > 如何在嵌套的 foreach 循环中获取匹配的计数器?

问题描述

我正在尝试获取嵌套 foreach 循环中的匹配数,但计数器始终设置为 0。我该如何解决?

my $file_counter = 0;
checkFilesInDirectory($den_file_input, $array_regex_tot, $expected_file_num);
sub checkFilesInDirectory {
    my ($dir_path, $array_reg, $expected_file_number) = @_;
    opendir (DIR, $dir_path)  or die "Can't open $dir_path: $!";
    my @file = readdir(DIR);
    foreach my $file (@file) {
      foreach my $regex (@array_regex) {
        if ($file =~ $regex) {
            $file_counter++;
        }
      } 
    }

    if ($file_counter < $file_previsti) {
        print "\nKO All'interno di $dir_path non e presente il numero di file previsti ($file_previsti).\n";
        # &ExitWithError($msg);
    } elsif ($file_counter == $expected_file_number) {
        print "\nOK " . substr(gmtime(time()), 11, 8) . "\n";
        # &ExitWithSuccess($msg);
    } elsif ($file_counter > $expected_file_number) {
        print "\nWARNING All'interno di $dir_path sono presenti piu di file ($file_counter)         di quelli previsti ($file_previsti).\n";
        # &ExitWithSignal($msg);
    }
    closedir(DIR);
}

标签: arraysregexperlnested-loops

解决方案


如果不查看更多代码,很难给出详细的建议。但有一件事突然出现在我身上:当您在@_子程序开始时解包时,您将第二个参数放入一个名为$array_reg;的标量变量中。但是您不会在代码中的任何地方使用该变量,而是在迭代正则表达式列表时使用名为@array_regex. 应该@$array_reg改为这个吗?你的代码中有use strict和吗?use warnings添加它们总是一个好主意,因为它们会指出这样的错误。

我也很困惑你为什么$file_counter在你的子程序之外声明。当使用子例程时(在任何语言中 - 不仅仅是 Perl),一个很好的经验法则是子例程不应该访问在子例程之外定义的变量。如果您需要在子例程中访问该数据,则将其作为额外参数传递。如果要更新该变量,则从子例程返回下一个值。


推荐阅读