Perl 的智能匹配是否适用于混合字符串和编译正则表达式的数组(或数组引用)?



我希望使用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;
}

基本上,我希望使解决方案更适合。

是的,这确实有效。问题是您的排除项之一是数字,而不是字符串。当smartmatch的右侧是一个数字时,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)。

发现Bug !

元素中的一个简单空字符串。
[ @global_excludes, $local_excludes ]

我猜在这种情况下perl 5.10.1数字一个空字符串

最新更新