Perl';s smartmatch针对混合字符串和已编译正则表达式的数组(或arrayrefs)工作?

Perl';s smartmatch针对混合字符串和已编译正则表达式的数组(或arrayrefs)工作?,perl,smartmatch,Perl,Smartmatch,我希望使用Perl的智能匹配对包含字符串和已编译正则表达式的数组进行查找: do_something($file) unless ($file ~~ [ @global_excludes, $local_excludes ]); (@global_excludes数组和$local_excludes数组引用都可以包含字符串或编译正则表达式的混合。) Perl中的智能匹配有那么智能吗?目前,当我使用v5.10.1运行上述程序时,我得到: 参数“script.sh”在test.pl第422行的智能

我希望使用Perl的智能匹配对包含字符串和已编译正则表达式的数组进行查找:

do_something($file) unless ($file ~~ [ @global_excludes, $local_excludes ]);
@global_excludes
数组和
$local_excludes
数组引用都可以包含字符串或编译正则表达式的混合。)

Perl中的智能匹配有那么智能吗?目前,当我使用v5.10.1运行上述程序时,我得到:

参数“script.sh”在test.pl第422行的智能匹配中不是数字。
参数“Debug.log”在test.pl第422行的智能匹配中不是数字。
参数“lib.pm”在test.pl第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($\u0)$\u0:“$\u0}@array
)。

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

[ @global_excludes, $local_excludes ]

我猜在这种情况下,perl 5.10.1会为一个数字指定一个空字符串,以供参考:“很明显,smartmatch几乎肯定会在将来改变或消失。不建议依赖其当前行为。”您有
@global\u excludes
$local\u excludes
。第一个是一个平面列表(我假设),但第二个看起来像一个数组引用。无论smartmatch是否满足您的要求,它都无法处理非平面的内容。它确实会自动取消对
[…]
的引用,但它可能会卡在内部的arrayref上。虽然这是未经证实的推测。是的,这是未经证实的:)我不认为这是问题所在。关于“为什么smartmarch认为$file是一个数字?”,没有办法回答您的问题,因为您完全没有提供有关
$file
是如何填充和使用的信息。更简单的语法:
sub exclude{my$file=shift;for(@){…}返回0}exclude($file,@global\u excludes,$local\u excludes)
@ikegami,很抱歉,但是你错了。
2~~“foo”
不会给出非数字警告。
“foo”~~2
会给出警告。这是因为smartmatch主要(尽管不是完全)是基于右侧参数的类型。错误消息中的字符串正在更改,因为他正在测试循环中
$file
的多个值。CJM:显式StringyFing对我没有效果:(这是因为我的perl是v10.5.1吗?Thanks@user3299282,它可能位于嵌套的arrayref中。我给出的字符串化示例代码不处理递归。请尝试使用或转储
[@global\u excludes,$local\u excludes]
,以查看问题所在。