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

前端之家收集整理的这篇文章主要介绍了有人可以解释为什么Perl以这种方式行事(可变范围界定)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的测试是这样的:
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不在范围内.

猜你在找的Perl相关文章