ジャンル不定の日記です。

Perlの多重ループで$_

Perl使ってると
for(0..5){
  処理
}
みたいに変数宣言をしないfor文を使うときがあるけど、
この時ループ処理で0から5の数値が格納される$_は名前とか気にしたことなかったが、$_はデフォルト変数と言うらしい。
他の言語はこういう機能が無いのが多いらしいが、便利ですね。

今回、元々デフォルト変数でループ処理してたところで多重ループする感じにしたんだが、
for(0..5){
  for(0..5){
    内側の処理
  }
  外側の処理
}
みたいな感じで変数省略のfor文を多重ループしたら内側のforで$_が書き換えられちゃうからできないと思って、
for(my $i=0;$i<=5;$i++){
  for(0..5){
    内側の処理
  }
  外側の処理
}
みたいな感じにした。

だが、変数省略のfor文を多重で使うことは可能らしいのね。
実際にどうなるのか確認しておこうと思って、
#!/usr/bin/perl

for(0..2){
    for(0..2){
        print "IN:$_\n";
    }
    print "OUT:$_\n";
}
こんな感じで実験してみた。
結果は、
IN:0
IN:1
IN:2
OUT:0
IN:0
IN:1
IN:2
OUT:1
IN:0
IN:1
IN:2
OUT:2
となる。

デフォルト変数$_がローカル変数になってるみたいな感じで機能してるが、$_のスコープについてググってみたらperldocによると$_はグローバル変数らしい。
for文を抜けた時に$_が元に戻される感じみたいね。

便利ではあるが、感覚的にわかりにくいかな。


[追記]
for文以外で$_が書き換わったらどうなるんだ?思って、
#!/usr/bin/perl

for(0..2){
    for(0..2){
        $_++;
        print "IN:$_\n";
    }
    print "OUT:$_\n";
}
こんな感じの実験をしてみた。結果は、
IN:1
IN:2
IN:3
OUT:0
IN:1
IN:2
IN:3
OUT:1
IN:1
IN:2
IN:3
OUT:2
for文を抜けた時に$_が元に戻される感じというよりもブロック終了時に元に戻される感じね。