perl - 为什么 Perl 中的默认作用域行为是这样的?
问题描述
我正在为学校学习 Perl,目前正在学习my
关键字的使用和 Perl 中的作用域。(作为参考,我正在查看如何在 Perl 中使用“my”关键字?。)希望这个问题还没有在其他地方被问过,但如果不是……为什么 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("%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
它更类似于动态分配的结构。
推荐阅读
- javascript - 使用mapbox gl和三个js在地图上的单个图层中渲染多个gltf 3D模型
- bokeh - 基于具有 Bokeh 的 Networkx 节点属性值的滑块
- svg - 如何为区域着色,即两个对象的交集?
- python - 创建 Choropleth 地图时出错,Json 解码错误
- python - 试图从网页监控产品,没有按预期工作
- plugins - 使用 cypress-plugin-snapshots 返回 .toMatchSnapshot 不是函数
- arrays - 如何从数组 swift 中获取第四个值
- react-native - 如何在 ReactNative 中模拟子 textInput 的自动对焦道具
- javascript - AppDelegate.m 文件中的#if DEBUG 条件从未被捕获
- javascript - 在使用 multer 上传新文件之前,有什么方法可以调用函数来擦除所有文件?