Perl的grep不适用于dereferenced数组

时间:2017-07-14 11:04:56

标签: arrays perl grep dereference

我想找到一个等同于python var in list成语的perl,并偶然发现了这个。

perl grep可以执行grep { $_ eq $var } @list表达式来匹配列表逻辑中的元素。

如果我使用像grep { $_ eq $var } @$list这样的derefenced数组,其中$ list定义为['foo','bar'],我得不到相同的结果。

有没有办法让grep使用解除引用的数组?

1 个答案:

答案 0 :(得分:0)

这个成语应该可以正常工作;我认为它不起作用的代码示例会有所帮助。就像这个快速玩具的例子一样,但是:

#!/usr/bin/perl
use strict;
use warnings;

use Test::More;

sub find_var {
    my ($var,$array) = @_;
    print "Testing for $var in [" . join(',',@$array) . "]...\n";
    if ( grep $var eq $_, @$array ) {
        return "found it";
    } else {
        return "no match!\n";
    }
}

my @array = qw(apple pear cherry football);
my $var = 'football';
my $var2 = 'tomato';

is(find_var($var, \@array), 'found it');
is(find_var($var2, \@array), 'found it');
done_testing();

这导致以下输出,这表明"足球"的第一次测试在数组引用成功,而第二次测试"番茄"不是:

Testing for football in [apple,pear,cherry,football]...
ok 1
Testing for tomato in [apple,pear,cherry,football]...
not ok 2
#   Failed test at array.pl line 22.
#          got: 'no match!
# '
#     expected: 'found it'
1..2
# Looks like you failed 1 test of 2.