arrays - 如何在嵌套的 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);
}
解决方案
如果不查看更多代码,很难给出详细的建议。但有一件事突然出现在我身上:当您在@_
子程序开始时解包时,您将第二个参数放入一个名为$array_reg
;的标量变量中。但是您不会在代码中的任何地方使用该变量,而是在迭代正则表达式列表时使用名为@array_regex
. 应该@$array_reg
改为这个吗?你的代码中有use strict
和吗?use warnings
添加它们总是一个好主意,因为它们会指出这样的错误。
我也很困惑你为什么$file_counter
在你的子程序之外声明。当使用子例程时(在任何语言中 - 不仅仅是 Perl),一个很好的经验法则是子例程不应该访问在子例程之外定义的变量。如果您需要在子例程中访问该数据,则将其作为额外参数传递。如果要更新该变量,则从子例程返回下一个值。
推荐阅读
- google-apps-script - Google 脚本中的时间戳
- python-3.x - 如何在抓取 Web 数据时处理空列表项?
- mongodb - 使用 MongoDB 解析名称服务器 Xamarin.Forms Android 时出错
- javascript - 前端反应没有将数据发送到 mongoDB 数据库
- python - 如何在不使用 Pandas 的情况下将 Numpy 转换为 Parquet?
- postgresql - 如何在没有转换表的情况下从 FOR EACH STATEMENT 获取更改的数据
- r - 数据的数值微分
- apache-kafka - 使用 RocksDb 作为状态后端的 Flink 检查点的空 chk-* 目录太多
- c# - 返回使用自定义 Get 方法的 getter 类的属性
- ruby-on-rails - 在 Rails 中将 JSON 类型添加到种子文件