据我所知,my
运算符是声明真正具有词法范围的变量,并使用local
运算符来声明变量。
任何人都能简单描述一下吗?
答案 0 :(得分:12)
local($ x)会保存全局变量$ x和的旧值 为子程序的持续时间分配一个新值 在从该子程序调用的其他函数中可见。这个完成了 在运行时,所以称为动态范围。 local()总是会影响 全局变量,也称为包变量或动态变量。
my($ x)创建一个仅在当前可见的新变量 子程序。这是在编译时完成的,所以它被称为词法或 静态范围。 my()总是影响私有变量,也称为私有变量 词汇变量或(不正确地)静态(缩放)变量。
查看Perl-FAQ's:
答案 1 :(得分:10)
my
创建一个局部变量。local
没有。
答案 2 :(得分:6)
我将添加一个简单的例子。
$var = "Global";
sub inner {
print "inner: $var\n";
}
sub changelocal {
my $var = "Local";
print "changelocal: $var\n";
&inner
}
sub changedynamic {
local $var = "Dynamic";
print "changedynamic: $var\n";
&inner
}
&inner
&changelocal
&changedynamic
这给出了以下输出(添加了注释)。
inner: Global # Finds the global variable.
changedynamic: Dynamic # Dynamic variable overrides global.
inner: Dynamic # Find dynamic variable now.
changelocal: Local # Local variable overrides global.
inner: Global # The local variable is not in scope so global is found.
您可以将动态变量视为屏蔽所调用函数的全局变量的一种方法。只有在最近的大括号内的代码中才能看到词法范围的变量。