有人可以解释为什么Perl会以这种方式行事(变量范围)吗?

dar*_*rin 9 perl

我的测试是这样的:

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不在范围内.