perl - Perl 中的 my 和 local 有什么区别?

标签 perl scoping

我看到它们都用在我正在尝试调试的脚本中,但文献还不清楚。有人可以为我揭开这个神秘面纱吗?

最佳答案

简单的回答是,my 在词法作用域中将变量标记为私有(private),而local 在动态作用域中将变量标记为私有(private)。

更容易理解my,因为它创建了通常意义上的局部变量。创建了一个新变量,并且只能在封闭的词法 block 内访问它,该词法 block 通常用花括号标记。大括号规则有一些异常(exception),例如:

foreach my $x (@foo) { print "$x\n"; }

但这只是 Perl 做你的意思。通常你会有这样的东西:

sub Foo {
   my $x = shift;

   print "$x\n";
}

在这种情况下,$x 是子例程私有(private)的,其范围由大括号括起来。需要注意的是,与 local 不同的是,my 变量的范围是根据文件中写入的代码定义的。这是一个编译时现象。

要理解本地,您需要考虑程序运行时的调用堆栈。当变量是 local 时,它会从对堆栈上低于该变量的所有内容执行 local 语句的位置开始重新定义,直到将堆栈返回给调用者包含 local 的 block 的位置。

一开始这可能会令人困惑,所以请考虑以下示例。

sub foo { print "$x\n"; }
sub bar { local $x; $x = 2; foo(); }

$x = 1;
foo(); # prints '1'
bar(); # prints '2' because $x was localed in bar
foo(); # prints '1' again because local from foo is no longer in effect

foo第一次被调用时,它看到$x的全局值是1。当bar被调用并且local $x 运行,重新定义堆栈上的全局 $x。现在,当从 bar 调用 foo 时,它会看到 $x 的新值 2。到目前为止,这并不是很特别,因为如果不调用 local 也会发生同样的事情。神奇的是,当 bar 返回时,我们退出由 local $x 创建的动态作用域,并且之前的全局 $x 返回到作用域。因此,对于 foo 的最终调用,$x 为 1。

您几乎总是想使用my,因为它为您提供了您正在寻找的局部变量。千载难逢,local 确实可以方便地做一些很酷的事情。

关于perl - Perl 中的 my 和 local 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/129607/

相关文章:

Perl PDL 胶水不起作用?

java - Regexp::Assemble 的 Java 等价物是什么?

perl - 我应该使用 Perl 和 Tk 在 Windows 上构建 GUI 应用程序吗?

perl - 用 bash sed 或脚本语言(TCL、perl)替换文件中的字符串

kotlin - 在 Kotlin 中确定 Java 静态方法的范围

r - 验证 R 中函数内的对象是否存在

r - 访问函数的父环境并移除对象

c++ - cpp 中的奇怪作用域

matlab - (Matlab)奇怪的精度损失,同时将复杂矩阵分配给局部变量

linux - 如何在包含/bin 路径但不包含 shbangs 的目录中查找文件?