为什么会打印 42:
$answer = 42;
$variable = "answer";
print ${$variable} . "\n";
但这不是:
my $answer = 42;
my $variable = "answer";
print ${$variable} . "\n";
为什么会打印 42:
$answer = 42;
$variable = "answer";
print ${$variable} . "\n";
但这不是:
my $answer = 42;
my $variable = "answer";
print ${$variable} . "\n";
只有包变量(在您的第一个示例中声明的那种)可以通过符号引用定位。词法 ( my
) 变量不能,这就是您的第二个示例失败的原因。
有关Perl 中两个独立变量系统的运行方式,请参阅出色的文章Coping with Scope 。并查看同样出色的为什么使用变量变量名是愚蠢的,以了解为什么这很愚蠢。:)
Perl 有两个完全独立但在很大程度上兼容的变量系统,包变量,如您的第一个示例,和词法变量,如第二个示例。有一些事情每个人都可以做,但另一个不能:
包变量是唯一可以是:
local
)词法变量是唯一可以关闭的变量(用于词法闭包)。
使用 strict 将有助于强制您使用 声明包变量our
,从而使差异更加清晰。
有好几次符号引用在 Perl 中很有用,主要集中在操作符号表上(比如在模块中编写自己import
的而不是使用Exporter
,在运行时为模块打补丁,各种其他元编程任务)。所有这些都是高级主题。
对于其他任务,通常有更好的方法来完成它,例如使用哈希。一般的经验法则是始终运行,use warnings; use strict;
除非您知道除了禁用一部分编译指示(例如no strict 'refs';
在尽可能小的范围内使用)之外别无他法。
符号引用仅适用于包变量。符号表不跟踪词法变量(这是词法变量的全部意义:)。