2017-07-14 10 views
-2

私はpython var in listイディオムに相当するperlを探して、これを見つけました。Perlのgrepが逆参照された配列では機能しません

perl grepは、リストロジックの要素と一致するようにgrep { $_ eq $var } @listという式を実行できます。

$ listが['foo'、 'bar']と定義されたgrep { $_ eq $var } @$listのようなderefenced配列を使用すると、私は同じ結果を得ません。

逆参照配列を使用してgrepを作成する方法はありますか?

+6

もっと具体的になることができますか? [mcve]を投稿してください。 'my $ 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

ちょうど私のエラーを実現しました。これは単純なタイプミスでした。はい、このイディオムは、逆参照された配列 –

関連する問題