我的测试是这样的:
use strict;
use warnings;
func();
my $string = 'string';
func();
sub func {
print $string, "\n";
}
Run Code Online (Sandbox Code Playgroud)
结果是:
Use of uninitialized value $string in print at test.pl line 10.
string
Run Code Online (Sandbox Code Playgroud)
Perl允许我们在定义函数之前调用它.但是,当函数使用仅在函数调用之后声明的变量时,该变量似乎未定义.这种行为是否记录在某处?谢谢!
Sob*_*que 12
的行为my中记录perlsub它归结到这一点- - perl知道$string是在范围上-因为my告诉它.
my运算符声明列出的变量在词法上限制在封闭块,条件(if/unless/elsif/else),循环(for/foreach/while/until/continue),子例程,eval或do/require/use '档案.
这意味着它在"范围内"从它首次"看到"的那一刻起直到当前"块"的结束括号.(或者在你的例子中 - 代码的结尾)
但是 - 在您的示例中my 也分配了一个值.
这个范围确定过程发生在编译时 - 其中perl检查它在何处有效使用$string.(谢谢strict).但是 - 它无法知道值是什么,因为在代码执行期间可能会发生变化.(并且分析非常重要)
因此,如果你这样做,可能会更清楚发生了什么:
#!/usr/bin/env perl
use strict;
use warnings;
my $string; #undefined
func();
$string = 'string';
func();
sub func {
print $string, "\n";
}
Run Code Online (Sandbox Code Playgroud)
$string在两种情况下都在范围内 - 因为my发生在编译时 - 在子例程被调用之前 - 但它没有设置超出undef第一次调用之前的默认值的值.
请注意,这与:
#!/usr/bin/env perl
use strict;
use warnings;
sub func {
print $string, "\n";
}
my $string; #undefined
func();
$string = 'string';
func();
Run Code Online (Sandbox Code Playgroud)
声明sub时,哪些错误$string不在范围内.
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |