2017-07-14 59 views
-2

我想找到一个相当于python var in list成语的perl,并且偶然发现了这个问题。Perl的grep不适用于取消引用的数组

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

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

有没有办法让grep使用解引用数组工作?

+6

你能更具体吗?请发布[mcve]。 '我的$ var ='foo';对于grep {$ _ eq $ var} @ {[qw/foo bar /]}}来说,'对我来说就像5.20.1上的魅力一样。 – simbabque

+0

'List :: Util :: any'可能会比'grep'更好,因为它在第一次匹配后停止。 –

+0

['Data :: Munge :: elem'](https://metacpan.org/pod/Data::Munge#elem-SCALAR,-ARRAYREF)也可以做到这一点。 – melpomene

回答

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. 
+0

刚刚意识到我的错误是一个简单的错字,是的,这个成语应该适用于解除引用的数组 –