首页 > 解决方案 > 为什么 Perl 中的默认作用域行为是这样的?

问题描述

我正在为学校学习 Perl,目前正在学习my关键字的使用和 Perl 中的作用域。(作为参考,我正在查看如何在 Perl 中使用“my”关键字?。)希望这个问题还没有在其他地方被问过,但如果不是……为什么 Perl 的默认行为是这样的?

在我看来,C 风格的默认作用域最有意义……您在块内声明一个变量,该变量存在于该块内,一旦您离开该块,该变量就不再可访问。为什么在 Perl 中,要指定这种行为,必须使用my关键字?似乎将变量的范围限制在仅使用它的地方将是良好的标准行为,并且my一直使用似乎非常多余,并且会导致代码混乱。

似乎有点像走进杂货店并在继续购物之前立即大声宣布您喜欢的某某品牌,以防您周围的任何人好奇(他们可能没有)。

(可能重复,这个问题可能会被删除......为什么在文件范围内用“my”声明 Perl 变量?。)

标签: perlscopelanguage-design

解决方案


如果你想要词法范围的变量,你需要某种形式的声明。[1]


在我看来,C 风格的默认作用域最有意义……您在块内声明一个变量,该变量存在于该块内,一旦您离开该块,该变量就不再可访问

正是它在 Perl 中的工作方式。int i在 C 中使用声明变量的地方,my $i在 Perl 中使用。两者都创建了一个词法范围的变量,也就是说一个仅在当前块和包含的块中可见的变量。在块外执行代码时,该变量不可访问。Perl 中的变量范围与 C 中的变量范围相同。[2]

// Can't use `i` here.           # Can't use `$i` here.
{                                {
   // Can't use `i` here.           # Can't use `$i` here.
   int i = 4;                       my $i = 4;
   printf("%d\n", i);       4       say $i;
   {                                {
      printf("%d\n", i);    4          say $i;
      int i = 5;                       my $i = 5;
      printf("%d\n", i);    5          say $i;
   }                                }
   printf("%d\n", i);       4       say $i;
}                                }
// Can't use `i` here.           # Can't use `$i` here.

  1. Python 没有显式的变量声明,但它也没有词法范围的变量;Python 变量是函数范围的。

  2. 但是,变量的生命周期并不相同。在 Perl 中,标量可以在其所在块的末尾保持活动状态,但对于 C 中的类似变量(具有“自动存储持续时间”的变量),情况并非如此。

    例如,

    # You can't use `@a` outside of the sub,
    # But you can use the created array anonymously.
    sub f { my @a = qw( abc def ); return \@a; }
    

    从这个意义上说,my $x它更类似于动态分配的结构。


推荐阅读