• ベストアンサー

foreach内での$_の書き換え

数年前にハッシュのデータをforeachで取り出す時、$_をいじると、$_はハッシュのデータと直接つながっているので、ハッシュのデータ(keyは変わらずvalueのほう)が書き換わってしまうと聞き、実際にやってみて書き換わってしまった覚えがあります。 %hash = ("red" => "aka", "green" => "midori", "blue" => "ao", "black" => "kuro"); foreach (%hash){ print "$_<br>\n"; $_ = "modify"; } print "<hr>\n"; foreach (values %hash ){ print "$_<br>\n"; } ↓↓↓↓↓↓html↓↓↓↓↓↓↓ blue ao green midori red aka black kuro ------------------------------------ modify modify modify modify ↑となったはず 先日それを試してみたら書き換わりませんでした。 以前は確かに書き換わった覚えがあります。 perlの仕様が変わったのでしょうか。それとも私が何か間違っているのでしょうか。 詳しい方にお教えいただければと質問しました。 よろしくお願いいたします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> 最初に試したのはniftyのアットホームページのサーバーだったのですが、 あー、あそこのPerlは 5.003とか4のあたりの骨董品のままじゃなかったでしたっけ? しかも標準モジュールすらないという。 ということで5.005_04のソースを引っ張り出してビルドしてから試してみました。 blue<br> ao<br> green<br> midori<br> red<br> aka<br> black<br> kuro<br> <hr> ao<br> midori<br> aka<br> kuro<br> どうも途中で仕様が変わったみたいですね。 5.6とか5.8に上がったタイミングかなあ?

tackross
質問者

お礼

度々のご回答ありがとうございます。 な、なるほどぉ。 確かにniftyはperl5としか書いてなく、モジュールも使えません。 わざわざ試してくださったんですね。 >どうも途中で仕様が変わったみたいですね。 5.6とか5.8に上がったタイミングかなあ? 合点がいき、スッキリしました。 どうもありがとうございました。

その他の回答 (2)

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.3

ちなみに5.6でも$_は実体を共有してます. この手のことがあるので $_とか@_は値を変えないか 明示的にコピーですね

tackross
質問者

お礼

回答ありがとうございます。 そうですね。 一見、別の器に入れているように見えて 実は仮の姿と言う感じですね。 早合点で質問してしまいましたが、 これはこれでまた勉強になりました。 ありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

今手元の5.8.8と5.10.0で試しましたけど、 green midori black kuro blue ao red aka ------ modify modify modify modify こんな感じですが。 テストしたときに何か勘違いしてたりしませんか?

tackross
質問者

お礼

回答ありがとうございます。 回答を見て、あわてて他のサーバー(land.to)で確かめて見た所、確かに書き換えられてました。私の早合点でした。 ただ、新たな疑問が・・・。 最初に試したのはniftyのアットホームページのサーバーだったのですが、相変わらずこちらで試すとデータが書き換わりません。 なぜなんでしょうか・・・うぅ。 ありがとうございました。