呼び出し位置によるインクリメント挙動
ファイルを連番に変換するスクリプトを書いていたところ、「001」から始めたかったのに、なぜか「000」から始まっていて警告も出ていなかったのでメモ。
#!/usr/bin/env perl use strict; use warnings; use feature qw/ say /; { my $num = 1; sub closure1 { return sprintf '%03d', $num++; } } say closure1(); say closure2(); { my $num = 1; sub closure2 { return sprintf '%03d', $num++; } }
001 000
うん、要するにclosure2が呼び出された時には見るべき$numの行にプログラムが達してないからundef状態で、それがsprintfに引数となり、「000」になってるってとこか。
なんか前にも似たようなことがあったな。何をしているのか自分。
しかしどうしてsprintfが
Use of uninitialized value in sprintf at - line x.
の警告を出さないのか気になる。
通常sprintfにundefを使用すると、
#!/usr/bin/env perl use strict; use warnings; use feature qw/ say /; say sprintf('%03d', my $i);
Use of uninitialized value $i in sprintf at - line 4 000
警告が出る。
以下はいいみたい。
#!/usr/bin/env perl use strict; use warnings; use feature qw/ say /; my $i; say sprintf('%03d',$i++);
000
後置だけどインクリメントした瞬間に「0」っぽくなってるゆーことですかね。。