我想找到一個相當於python var in list
成語的perl,並且偶然發現了這個問題。Perl的grep不適用於取消引用的數組
perl grep可以執行grep { $_ eq $var } @list
表達式以匹配列表邏輯中的元素。
如果我使用像grep { $_ eq $var } @$list
這樣的derefenced數組,其中$ list被定義爲['foo','bar'],我不會得到相同的結果。
有沒有辦法讓grep使用解引用數組工作?
我想找到一個相當於python var in list
成語的perl,並且偶然發現了這個問題。Perl的grep不適用於取消引用的數組
perl grep可以執行grep { $_ eq $var } @list
表達式以匹配列表邏輯中的元素。
如果我使用像grep { $_ eq $var } @$list
這樣的derefenced數組,其中$ list被定義爲['foo','bar'],我不會得到相同的結果。
有沒有辦法讓grep使用解引用數組工作?
該成語應該可以正常工作;我認爲一個不起作用的代碼示例會很有幫助。正如這一個匆匆玩具例如,儘管:
#!/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.
剛剛意識到我的錯誤是一個簡單的錯字,是的,這個成語應該適用於解除引用的數組 –
你能更具體嗎?請發佈[mcve]。 '我的$ var ='foo';對於grep {$ _ eq $ var} @ {[qw/foo bar /]}}來說,'對我來說就像5.20.1上的魅力一樣。 – simbabque
'List :: Util :: any'可能會比'grep'更好,因爲它在第一次匹配後停止。 –
['Data :: Munge :: elem'](https://metacpan.org/pod/Data::Munge#elem-SCALAR,-ARRAYREF)也可以做到這一點。 – melpomene