for文を使うとき、
- $_を使う
- my変数を使う
- 中でmy変数に代入して使う
のような書き方があると思うんですが、
それぞれを書き換えてみたとき、挙動が1と2は同じで、3だけ違ったのがびっくりだったので、めもめも。
- 1. $_を書き換え
my @arr = qw/a b c d e f g/;
for (@arr) {
if ($_ eq "c") {
$_ = "!!!";
}
}
print @arr; # ab!!!defg 破壊的
- 2. my変数を使って書き換え
my @arr = qw/a b c d e f g/;
for my $arg (@arr) {
if ($arg eq "c") {
$arg = "!!!";
}
}
print @arr; # ab!!!defg 破壊的
- 3. 中でmy変数に代入して書き換え
my @arr = qw/a b c d e f g/;
for (@arr) {
my $arg = $_;
if ($arg eq "c") {
$arg = "!!!";
}
}
print @arr; # abcdefg 非破壊的
こんな感じ。
Devel::Peekを使ってみてみたら、
1と2は内部的にまったく同じものとして処理されていました。
for宣言時のmy変数は、$_と同じく、for構文が用意してくれる変数、ということなのでしょうか。
一時的に中身を書き換えたい、というときなどは、ループ内で代入してあげるのがよさそうですね。