我应该如何在 Perl 中使用“my”关键字?
Posted
技术标签:
【中文标题】我应该如何在 Perl 中使用“my”关键字?【英文标题】:How should I use the "my" keyword in Perl? 【发布时间】:2014-01-20 07:03:34 【问题描述】:我经常在网上的示例 Perl 脚本中看到变量名前面的“my”关键字,但我不知道它是什么意思。我尝试在线阅读手册页和其他网站,但鉴于我看到它的使用方式与手册之间的差异,我很难辨别它的用途。
例如,它用于获取本文中的数组长度: Find size of an array in Perl
但是手册上说:
A my 声明列出的变量是本地的(词法上的) 封闭块、文件或 eval。如果列出了多个值,则 列表必须放在括号中。
它有什么作用以及如何使用?
【问题讨论】:
Re“它用于获取本文中数组的长度”,一点也不。my
至少没有考虑到它。是标量赋值运算符 (=
) 在 @arr
上强制执行标量上下文。
如果它不是真正的“你的”,你就不应该使用它。
【参考方案1】:
my
限制变量的scope。变量的作用域是可以看到的地方。将变量的范围缩小到需要变量的位置是良好编程的一个基本方面。它使代码更具可读性和更不容易出错,并带来一系列衍生的好处。
如果您不使用my
声明变量,则会创建一个全局变量。这是要避免的。使用use strict;
告诉 Perl 您希望避免隐式创建全局变量,这就是为什么您应该始终在程序中使用use strict;
(和use warnings;
)。
相关阅读:Why use use strict;
and use warnings;
?
【讨论】:
终于有了一个解释为什么的答案。 对于从 JS 来到这里的人:本质上就像 javascript 中的var
和 let
。如果没有'use strict';
,JS 将允许您在没有任何关键字的情况下声明新的全局变量,这不是最佳实践。
@Electric Coffee,用 JS 术语来说,问题是“let
和 var
有什么作用以及应该如何使用它们?”是的,答案大致相同。 (JS 的 let
变量很像 Perl 的 my
变量,只是无法捕获 let
变量。)
我的意思是,如果人们从 JS 来到 Perl,这将是一种解释相同概念的简单方法
@ElectricCoffee 1) 了解范围的程序员在切换语言后不需要再次向他们解释。 2)不确定您是否确实解释了范围,以 JS 程序员会理解或其他方式。也许你想解释use strict;
?但这不是问题所在,use strict;
的作用远不止于此。或者,也许您打算传达 my
限制 var 的范围有点像 let
和 var
做的那样,但这几乎是答案的第一句话。 3) 如果您希望以不同的方式回答问题,这就是 Answers 的用途。【参考方案2】:
快速总结:my
创建一个新变量,local
临时修改一个变量的值
在下面的示例中,$::a 指的是“全局”命名空间中的 $a。
$a = 3.14159;
my $a = 3;
print "In block, \$a = $a\n";
print "In block, \$::a = $::a\n";
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";
# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159
即local
临时改变变量的值,但只在它存在的范围内。
来源:http://www.perlmonks.org/?node_id=94007
更新
关于our
和my
的区别请看
(感谢 ThisSuitIsBlackNot)。
【讨论】:
我认为这个答案需要一些调整。您有一个代码示例演示了my
的使用,但随后用一个谈论local
的句子,就好像您刚刚演示了local
的使用一样,尽管local
在此的任何地方都没有演示回答。我认为您有点错误地引用了 PerlMonks 上的源代码,它有两个代码示例。关于local
的那句话是在描述另一句,而不是你在此处转录的那句。
在代码示例中不使用local
,为什么还要提到它?
@Greenonline:按照这个逻辑,如果你根本没有代码示例,你不应该提什么吗?
嗯,是的。如this comment 中所述,您提供的代码示例未显示local
的使用。但是,您随后解释了local
的范围,但尚未演示。问题是您从 perlmonks 页面复制了错误的代码 sn-p。这相当具有误导性。【参考方案3】:
Private Variables via my() 是my
的主要文档。
在您提到的数组大小示例中,它不用于查找数组的大小。它用于创建一个新变量来保存数组的大小。
【讨论】:
以上是关于我应该如何在 Perl 中使用“my”关键字?的主要内容,如果未能解决你的问题,请参考以下文章