変数に値を入れるのはサブルーチン呼び出しよりも前に
おや?、と思ったことがあったのでメモ。
ある変数をサブルーチンより外側でサブルーチンよりも前に宣言して値を入れていて、サブルーチンはその変数を参照していて、しかしその変数よりも前にサブールーチンを呼び出すと、サブルーチン内で値が参照できない。
何言ってんのかわかんないな。
以下、例。
#!/usr/bin/perl # test.pl use strict; use warnings; test(); my $test= 'TEST'; sub test { print "$test\n"; } __END__
% ./test.pl Use of uninitialized value in concatenation (.) or string at test.pl line 8. %
何も出ない。
まあ順番に考えていったらその通りなんだけど、上から見ていってtest();に来たときにはまだ$testに値は入っていないわけで。
ただレキシカル変数としてスクリプト内に存在しているから、あの「Global symbol "$test" requires explicit package name」は出ないということなんだろうな。
#!/usr/bin/perl # test.pl use strict; use warnings; my $test= 'TEST'; test(); sub test { print "$test\n"; } __END__
% ./test.pl TEST %
同じことを書いている方がいました。
レキシカル変数の宣言場所より前で、その変数を使った関数を呼ばないようにしよう - だるろぐ
もう少し早く見つけていれば。
というか基礎的なことか…。
まだまだ覚えることがいっぱいだ。