0

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

4

2 回答 2

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)。

于 2015-05-27T15:12:39.107 回答
0

发现错误!在的元素之一中是一个简单的空字符串

[ @global_excludes, $local_excludes ]

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

于 2015-06-01T16:10:02.790 回答