如何遍历数组并获取匹配项的计数?
How can I iterate over array and get the count of matches?
我正在尝试检查目录中的文件数是否符合我的预期。我需要检查文件是否与我传递的正则表达式匹配。我将正则表达式的字符串传递并拆分为一个数组,有人可以帮助我吗?谢谢
my $dir = 'C:\Users\dealmeidal\Desktop\perl_file';
my $string = '3-qr/Clawbacks_20190421\.csv$/-qr/Premiums_20190421\.csv$/-qr/Polizza_20190421\.csv$/';
my @array_regex_tot = (split /-/, $string);
my $expected_file_num = int(shift(@array_regex_tot));
my $file_counter = 0;
checkFilesInDirectory($dir, \@array_regex_tot, $expected_file_num);
sub checkFilesInDirectory {
my ($dir_path, $array_reg, $file_previsti) = @_;
opendir (DIR, $dir_path) or die "Can't open $dir_path: $!";
foreach my $file (@file) {
foreach my $regex (@$array_reg) {
if ($file =~ $regex) {
$file_counter++;
}
}
}
if ($file_counter < $expected_file_num) {
print "KO. Less files than expected.\n";
} elsif ($file_counter == $expected_file_num) {
print "OK Correct num of files\n";
} elsif ($file_counter > $expected_file_num) {
print "WARNING More files than expected.\n";
}
closedir(DIR);
}
问题是您不能在模式中包含实际的 Perl 代码。您得到的是用于创建预编译模式的 Perl 命令,而不是模式。因此 qr//
位在您的匹配中被视为文字。打开 regex debugging:
即可看到
use re 'debug';
my $pattern = 'qr/Clawbacks_20190421\.csv$/';
'Clawbacks_20190421.csv' =~ $pattern;
这将输出:
Compiling REx "qr/Clawbacks_20190421\.csv$/"
Final program:
1: EXACT <qr/Clawbacks_20190421.csv> (9)
9: SEOL (10)
10: EXACT </> (12)
12: END (0)
anchored "qr/Clawbacks_20190421.csv"$ at 0 (checking anchored) minlen 26
Freeing REx: "qr/Clawbacks_20190421\.csv$/"
如您所见,qr/
和 /
是模式的一部分,与您的文件名不匹配。如果无法更改输入字符串,则必须进行清理。
my $pattern = 'qr/Clawbacks_20190421\.csv$/';
$pattern =~ m{^qr/(.+)/};
my $clean = ;
'Clawbacks_20190421.csv' =~ $clean;
我们在这里使用不同的定界符,这样就不必转义斜杠了。
我正在尝试检查目录中的文件数是否符合我的预期。我需要检查文件是否与我传递的正则表达式匹配。我将正则表达式的字符串传递并拆分为一个数组,有人可以帮助我吗?谢谢
my $dir = 'C:\Users\dealmeidal\Desktop\perl_file';
my $string = '3-qr/Clawbacks_20190421\.csv$/-qr/Premiums_20190421\.csv$/-qr/Polizza_20190421\.csv$/';
my @array_regex_tot = (split /-/, $string);
my $expected_file_num = int(shift(@array_regex_tot));
my $file_counter = 0;
checkFilesInDirectory($dir, \@array_regex_tot, $expected_file_num);
sub checkFilesInDirectory {
my ($dir_path, $array_reg, $file_previsti) = @_;
opendir (DIR, $dir_path) or die "Can't open $dir_path: $!";
foreach my $file (@file) {
foreach my $regex (@$array_reg) {
if ($file =~ $regex) {
$file_counter++;
}
}
}
if ($file_counter < $expected_file_num) {
print "KO. Less files than expected.\n";
} elsif ($file_counter == $expected_file_num) {
print "OK Correct num of files\n";
} elsif ($file_counter > $expected_file_num) {
print "WARNING More files than expected.\n";
}
closedir(DIR);
}
问题是您不能在模式中包含实际的 Perl 代码。您得到的是用于创建预编译模式的 Perl 命令,而不是模式。因此 qr//
位在您的匹配中被视为文字。打开 regex debugging:
use re 'debug';
my $pattern = 'qr/Clawbacks_20190421\.csv$/';
'Clawbacks_20190421.csv' =~ $pattern;
这将输出:
Compiling REx "qr/Clawbacks_20190421\.csv$/"
Final program:
1: EXACT <qr/Clawbacks_20190421.csv> (9)
9: SEOL (10)
10: EXACT </> (12)
12: END (0)
anchored "qr/Clawbacks_20190421.csv"$ at 0 (checking anchored) minlen 26
Freeing REx: "qr/Clawbacks_20190421\.csv$/"
如您所见,qr/
和 /
是模式的一部分,与您的文件名不匹配。如果无法更改输入字符串,则必须进行清理。
my $pattern = 'qr/Clawbacks_20190421\.csv$/';
$pattern =~ m{^qr/(.+)/};
my $clean = ;
'Clawbacks_20190421.csv' =~ $clean;
我们在这里使用不同的定界符,这样就不必转义斜杠了。