我的测试是这样的:
use strict; use warnings; func(); my $string = 'string'; func(); sub func { print $string,"\n"; }
结果是:
Use of uninitialized value $string in print at test.pl line 10. string
Perl允许我们在定义函数之前调用函数.但是当函数使用仅在函数调用之后声明的变量时,变量看起来是未定义的.这个行为是否记录在某个地方?谢谢!
解决方法
我的行为记录在
perlsub
– 它归结为这个 – perl知道$string在范围内 – 因为我这么说.
The my operator declares the listed variables to be lexically confined to the enclosing block,conditional (if/unless/elsif/else),loop (for/foreach/while/until/continue),subroutine,eval,or do/require/use’d file.
这意味着它从“首先被看到”到现在的“块”的关闭括号之间是“范围”. (或者在你的例子中 – 代码的结尾)
然而,在你的例子中,我也分配一个值.
此范围界定过程发生在编译时 – 其中perl检查使用$string有效的位置. (感谢严格).但是,它不能知道该值是什么,因为在代码执行期间可能会发生变化. (并不是平凡的分析)
所以如果你这样做可能会更清楚一些事情:
#!/usr/bin/env perl use strict; use warnings; my $string; #undefined func(); $string = 'string'; func(); sub func { print $string,"\n"; }
$string在这两种情况下都是范围的 – 因为我在编译时发生了 – 在子例程被调用之前 – 但是在第一次调用之前,它没有超出默认值undef的值.
注意与以下对比:
#!/usr/bin/env perl use strict; use warnings; sub func { print $string,"\n"; } my $string; #undefined func(); $string = 'string'; func();
哪些错误是因为当sub被声明时,$string不在范围内.