为什么Perl中的默认范围行为是这样的?

我正在为学校学习 Perl,目前正在学习my关键字的使用和 Perl 中的范围界定。(作为参考,我正在查看如何在 Perl 中使用“我的”关键字?)

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

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

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

回答

如果你想要词法范围的变量,你需要某种形式的声明。[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("%dn", i);       4       say $i;
   {                                {
      printf("%dn", i);    4          say $i;
      int i = 5;                       my $i = 5;
      printf("%dn", i);    5          say $i;
   }                                }
   printf("%dn", 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更类似于动态分配的结构。


回答

因为这就是 Larry Wall 在 1987 年所做的,而 Perl 5 仍然与该决定向后兼容。词法变量直到 1994 年的 Perl 5 才被引入,到那时已经有相当大的 Perl 4 程序安装基础。

我会推测为什么。Perl 并没有被设想为一种应用程序语言,它成为了一种应用程序语言。Perl 1 于 1987 年编写,是sed、awk和Bourne shell的更强大的替代品。

如果您有一个问题,通常会使用 sed 或 awk 或 sh,但它超出了它们的能力或必须运行得更快一点,并且您不想用 C 编写愚蠢的东西,那么 perl 可能适合您。

来自 Perl 1.0 手册

sed 和 awk 程序通常只有一行。并且在 shell 中变量是全局的。鉴于 Perl 1 的目的,这很好。

在过去的几十年中,公认的软件工程标准发生了很大变化。当系统更小更简单时,全局变量更容易被接受。随着复杂性的增加,全局变量越来越危险。

  • That makes sense. Knowing the background (early history) of Perl as an alternative to sed/awk/sh, I can see how it develops that way. I suppose at some point, somebody said "Hey, what if I want non-global variables?" and they came up with a way to do that (the ```my``` keyword) that still allowed backward compatibility.

以上是为什么Perl中的默认范围行为是这样的?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>