• ベストアンサー

連想配列とforeach

連想配列 %hogeにおいて、.name の名前が最後に付く配列の値を取り出したいと思い、下記のようにしました。 foreach ($hoge{/.*\.name$/}) {  print "$_\n"; } としてみましたが期待した出力がされませんでした。こういう描き方って出来ないんでしょうか?それともどこか間違ってますか?

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

  • ベストアンサー
  • tailkuppa
  • ベストアンサー率53% (52/98)
回答No.1

$_ = "right.name"; print /.*\.name$/; や、 $_ = "chigau.namae"; print /.*\.name$/; の結果を見てみると分かりますが、この正規表現は、そのままで用いると変数 $_ に代入された値のマッチ結果になります。 foreach (keys %hoge) { # ハッシュのキーを一つずつ $_ に代入  if (/.*\.name$/) {   print "$hoge{$_}\n";  } } のように、一旦$_ に代入する形式にすれば、お望みのことは可能だと思います。

yatokesa
質問者

お礼

回る数を減らそうと画策しましたが、配列の数分だけ回らないとだめと言うことですね。 ありがとうございました。

その他の回答 (1)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

ハッシュ(連想配列)のキーに正規表現を書くことはできません。 やるなら、次のようにします。   foreach (keys %hoge) {     print $hoge{$_} if /\.name$/;   } あるいは、   foreach (grep /\.name$/, keys %hoge) {     print "$hoge{$_}\n";   } もしくは、   foreach (map $hoge{$_}, grep /\.name$/, keys %hoge) {     print "$_\n";   }

yatokesa
質問者

お礼

>ハッシュ(連想配列)のキーに正規表現を書くことはできません。 そうですか。出来ると嬉しいこともあるので是非対応して欲しいところです。その分オーバーヘッドが大きくなってしまっては元も子もないですが。 色々書き方があるものですね。勉強になります。 #といっても後半の2つはほとんど意味不明です^^;)。勉強しておきます。 ありがとうございました。

関連するQ&A