gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:15:35 25 4
gpt4 key购买 nike

我正在为学校学习 Perl,目前正在学习 my 的使用关键字和关于 Perl 中的作用域。 (作为引用,我正在查看 How should I use the "my" keyword in Perl? 。)希望这个问题还没有在其他地方被问过,但如果没有……为什么 Perl 的默认行为是这样的?
在我看来,C 风格的默认作用域最有意义……您在块内声明一个变量,该变量存在于该块内,一旦离开该块,该变量将不再可访问。为什么在 Perl 中,要指定此行为,您必须使用 my关键词?似乎将变量的范围限制在使用它的地方将是一个很好的标准行为,并且使用 my所有的时间似乎都是非常多余的,就像它会导致代码困惑一样。
似乎有点像走进杂货店,在继续购物之前立即大声宣布您喜欢的某某品牌,以防万一您周围的人好奇(他们可能不是)。
(可能重复,这个问题可能会被删除... Why declare Perl variable with "my" at file scope? 。)

最佳答案

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

It seems to me that a C-style default scoping makes the most sense...you declare a variable inside a block, the variable exists inside that block, and once you leave that block, that variable is no longer accessible


这正是它在 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.
  • Python 没有显式的变量声明,但它也没有词法范围的变量; Python 变量是函数作用域的。
  • 但是,变量的生命周期是不一样的。标量可以在它驻留在 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更类似于动态分配的结构。
  • 关于perl - 为什么 Perl 中的默认范围行为是这样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65226195/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com