Perl的smartmatch是否适用于混合字符串和编译正则表达式的数组(或arrayrefs)?

时间:2015-05-27 14:40:08

标签: perl smartmatch

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

2 个答案:

答案 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会为数字

计算一个空字符串