我应该如何在 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 中的 varlet。如果没有'use strict';,JS 将允许您在没有任何关键字的情况下声明新的全局变量,这不是最佳实践。 @Electric Coffee,用 JS 术语来说,问题是“letvar 有什么作用以及应该如何使用它们?”是的,答案大致相同。 (JS 的 let 变量很像 Perl 的 my 变量,只是无法捕获 let 变量。) 我的意思是,如果人们从 JS 来到 Perl,这将是一种解释相同概念的简单方法 @ElectricCoffee 1) 了解范围的程序员在切换语言后不需要再次向他们解释。 2)不确定您是否确实解释了范围,以 JS 程序员会理解或其他方式。也许你想解释use strict;?但这不是问题所在,use strict; 的作用远不止于此。或者,也许您打算传达 my 限制 var 的范围有点像 letvar 做的那样,但这几乎是答案的第一句话。 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

更新

关于ourmy的区别请看

What is the difference between my and our in Perl?

(感谢 ThisSuitIsBlackNot)。

【讨论】:

我认为这个答案需要一些调整。您有一个代码示例演示了my 的使用,但随后用一个谈论local句子,就好像您刚刚演示了local 的使用一样,尽管local 在此的任何地方都没有演示回答。我认为您有点错误地引用了 PerlMonks 上的源代码,它有两个代码示例。关于local 的那句话是在描述另一句,而不是你在此处转录的那句。 在代码示例中不使用local,为什么还要提到它? @Greenonline:按照这个逻辑,如果你根本没有代码示例,你不应该提什么吗? 嗯,是的。如this comment 中所述,您提供的代码示例未显示local 的使用。但是,您随后解释了local 的范围,但尚未演示。问题是您从 perlmonks 页面复制了错误的代码 sn-p。这相当具有误导性。【参考方案3】:

Private Variables via my() 是my 的主要文档。

在您提到的数组大小示例中,它不用于查找数组的大小。它用于创建一个新变量来保存数组的大小。

【讨论】:

以上是关于我应该如何在 Perl 中使用“my”关键字?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中修改 HTML 文件?

查找文件中所有出现的字符串并在 Perl 中打印其行号

如何在 Perl 中表示集合?

10天学会Perl第二天——变量

是否有 Perl 快捷方式来计算字符串中的匹配数?

perl中的' b'字符如何工作?