我希望使用Perl的智能匹配对包含字符串和编译的正则表达式的数组进行查找:
do_something($file) unless ($file ~~ [ @global_excludes, $local_excludes ]);
(@global_excludes
数组和$local_excludes
数组引用都可以包含字符串或编译的正则表达式的混合。)
Perl中的智能匹配是否聪明?目前,当我使用v5.10.1运行上述内容时,我得到:
Argument "script.sh" isn't numeric in smart match at test.pl line 422.
Argument "Debug.log" isn't numeric in smart match at test.pl line 422.
Argument "lib.pm" isn't numeric in smart match at test.pl line 422.
...
为什么smartmatch认为$file
是一个数字?
目前,我只是手动执行此操作:
do_something($file) unless exclude ($file, [ @global_excludes, $local_excludes ]);
exclude
看起来像这样:
sub exclude
{
my ($file, $list) = @_;
foreach my $lookup (@$list)
{
if (is_regexp($lookup))
{
return 1 if $file =~ $lookup;
}
else
{
return 1 if $file eq $lookup;
}
}
return 0;
}
基本上,我希望更多地使解决方案Perly。
答案 0 :(得分:2)
是的,这确实有效。问题是你的一个排除是一个数字,而不是一个字符串。当智能匹配的右侧是数字时,Perl会进行==
数字比较。
my $s = 'foo';
$s ~~ 2; # means $s == 2, warns "$s isn't numeric"
$s ~~ '2'; # means $s eq '2', no warning
如果您打算进行字符串比较,请确保您的排除是字符串。如有必要,请先将其字符串化(例如@array = map { ref($_) ? $_ : "$_" } @array
)。
答案 1 :(得分:0)
发现错误!
中的一个元素中是一个简单的空字符串[ @global_excludes, $local_excludes ]
我想在这种情况下,perl 5.10.1会为数字
计算一个空字符串