Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

呼び出し位置によるインクリメント挙動

ファイルを連番に変換するスクリプトを書いていたところ、「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」っぽくなってるゆーことですかね。。