2016-10-21 1 views
0

Perlで小さな事があまりにもうまくいかない理由はわかりません。ごめんなさい。PerlはXが配列内の要素であるかどうかを調べる

私は2時間ほど試してきましたが、結果を得ることができませんでした。

my $technologies = 'json.jquery..,php.linux.'; 
my @techarray = split(',',$technologies); 

#my @techarray = [ 
#   'json.jquery..', 
#   'php.linux.' 
#  ]; 

my $search_id = 'json.jquery..'; 

check_val(@techarray, $search_id); 

そして、上記の項目を配列で検索するために「if」を実行しています。それは私のために働いていません。

sub check_val{ 
     my @techarray = shift; 
     my $search_id = shift; 
      if (grep {$_ eq $search_id} @techarray) { 
       print "It is there \n"; 
      }else{ 
       print "It is not there \n"; 
      } 
    } 

出力:常にそれ以外の状態になり、「そこにはありません」と返されます。 :(

任意のアイデアが。私は愚かな過ちで行われているか?

+4

配列の割り当てを次のように変更します。 'my @techarray =( 'json.jquery ..'、 'php.linux。');' – Miller

+0

@techarrayはsplitメソッドの出力です。 – Raja

+1

質問に記載されているように問題を再現できない場合は、適切な[mcve]を作成する必要があります。 –

答えて

2

あなたはスカラー(リファレンス)として、その唯一の要素として、@techarrayに割り当てられている無名配列が[ ... ]を、使用しています。それは@arr = 'a';のようなものです。配列は(...)によって定義される。

救済は、配列を定義my @techarray = (...)、または適切に配列リファレンスを定義するために、次にあなたが

my $rtecharray = [ .... ]; 
if (grep {$_ eq $search_id} @$rtecharray) { 
    # .... 
} 
を検索するときに逆参照するかのいずれかであります

リスト操作のすべての種類についてはList::UtilList::MoreUtilsをご覧ください。問題の変化に更新


、サブが

を追加しましたので、これは、より有益である何か他のものを持っています。

配列を関数に渡すと、その要素のフラットなリストとして渡されます。関数内で最初のshiftが最初の要素 をピックアップし、次に2番目の要素shiftが2番目の要素を取り上げます。

次に、文字列の場合は、'json.jquery..'要素のみで検索します。

代わりに、あなたは、参照を渡し

check_val(\@techarray, $search_id); 

および機能でそのようにそれを使用することができます。


あなたは配列を渡すと

my (@array, $search_id) = @_; # WRONG 

としての機能で引数を取得する場合、あなたは@array@_の全てを取得し、実際であること。

たとえば、this post(機能に移る)とthis post(機能から戻る)を参照してください。

一般的に、リストを参照渡しすることをお勧めします。

+0

うわー...あなたは正しいです。私はちょうどarrayrefを定義してdereferencedし、それが動作を開始します。 :) – Raja

+0

2番目の例では、 '@ array'にはすべてが含まれ、' $ search_id'は 'undef'になります。 –

+0

@MattJacobはい、ただ修正しました - ありがとうございます。 – zdim

関連する問題