Perl日記

PerlとかRubyとかPHPとかPythonとか

変数に値を入れるのはサブルーチン呼び出しよりも前に

おや?、と思ったことがあったのでメモ。
ある変数をサブルーチンより外側でサブルーチンよりも前に宣言して値を入れていて、サブルーチンはその変数を参照していて、しかしその変数よりも前にサブールーチンを呼び出すと、サブルーチン内で値が参照できない。
何言ってんのかわかんないな。
以下、例。

#!/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
%


同じことを書いている方がいました。
レキシカル変数の宣言場所より前で、その変数を使った関数を呼ばないようにしよう - だるろぐ
もう少し早く見つけていれば。
というか基礎的なことか…。
まだまだ覚えることがいっぱいだ。