プロが教える店舗&オフィスのセキュリティ対策術

数年前にハッシュのデータを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の仕様が変わったのでしょうか。それとも私が何か間違っているのでしょうか。
詳しい方にお教えいただければと質問しました。
よろしくお願いいたします。

A 回答 (3件)

> 最初に試したのは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に上がったタイミングかなあ?
    • good
    • 0
この回答へのお礼

度々のご回答ありがとうございます。

な、なるほどぉ。
確かにniftyはperl5としか書いてなく、モジュールも使えません。
わざわざ試してくださったんですね。

>どうも途中で仕様が変わったみたいですね。
5.6とか5.8に上がったタイミングかなあ?

合点がいき、スッキリしました。
どうもありがとうございました。

お礼日時:2008/03/28 16:47

ちなみに5.6でも$_は実体を共有してます.


この手のことがあるので
$_とか@_は値を変えないか
明示的にコピーですね
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そうですね。
一見、別の器に入れているように見えて
実は仮の姿と言う感じですね。

早合点で質問してしまいましたが、
これはこれでまた勉強になりました。
ありがとうございました。

お礼日時:2008/03/29 09:13

今手元の5.8.8と5.10.0で試しましたけど、


green
midori
black
kuro
blue
ao
red
aka
------
modify
modify
modify
modify

こんな感じですが。
テストしたときに何か勘違いしてたりしませんか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/28 12:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!