• ベストアンサー

すべてにパターンマッチしてしまうのはなぜ?

以下のようなスクリプトを書いた時に my @list = ('ab', 'cd', 'efg', 'hijk'); foreach my $line (@list){ #print "$line\n"; if ($line =~ m/ ^a| ^e| /x){ print "$line "; }} 標準出力は ab cd efg hijk となり、@list内の要素すべてにマッチしたことになってしまいます。 理由がわからずごちゃごちゃといじっていると、検索部分を =~ m// としても全く同じことになります。 これは、どの配列の要素も空(くう?)を含むためにヒットしてしまう・・・ ということなのでしょうか? どのように理解すれば良いのでしょうか?基本的な質問で申し訳ございませんが、どなたかよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

へい, 「どの配列の要素も空(くう?)を含むためにヒットしてしまう」 という認識で OK です.

miyakosais
質問者

お礼

とてもよく理解できました。 どうもありがとうございます。

その他の回答 (2)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

my @list = ('ab', 'cd', 'efg', 'hijk'); foreach my $line (@list){ - - if ($line =~ /^[a,e]/){ - - - - print "$line "; - - } } 賀したいことですが、クラスを | で区切りたいので my @list = ('ab', 'cd', 'efg', 'hijk'); fmy @list = ('ab', 'ced', 'efg', 'hijk'); foreach my $line (@list){ if ($line =~ /^a | ^e/x){ print "$line "; } } では・・・・

miyakosais
質問者

補足

ありがとうございます。 質問がわかりにくくて申し訳ございませんでした。 aから始まる要素とeから始まる要素をヒットしたいという意図が もともとあったのですが、質問の趣旨としては すべてヒットになってしまうことをどう理解すれば良いのか? ということでした。

  • momenlara
  • ベストアンサー率60% (6/10)
回答No.2

たぶん、aもしくはeで始まる要素だけを出力したいのだと想像しての回答です。 ポイントは以下の行ではないでしょうか。 ^e| if文の条件が複数行になっていて気づきにくいのですが、 1行にしてみるとなんとなく分かるかも。 if ($line =~ m/^a|^e|/x){ m//xのパターンマッチとして、条件が3つ指定されています。 ・先頭がaで始まるもの ・先頭がeで始まるもの ・条件なし eの後ろに|があるために、全て真になる条件がまぎれこんでいるようです。 以下のようにしたら、想定した動作にならないでしょうか。 if ($line =~ m/^a|^e/x){

miyakosais
質問者

お礼

なるほど。 ・条件なし でヒットしてしまうという指定になってしまうわけですね。 理解できました!!ありがとうございます。

関連するQ&A