我应该如何在Perl中使用“我的”关键字?


90

在示例Perl脚本在线中,我始终在变量名之前看到“ my”关键字,但我不知道它是什么意思。我尝试在线阅读手册页和其他网站,但是由于我的使用方式和手册之间存在差异,因此我很难分辨它的用途。

例如,在本文中,它用于获取数组的长度: 在Perl中查找数组的大小

但是手册说:

my声明列出的变量在包围的块,文件或eval中是局部的(按词法)。如果列出了多个值,则该列表必须放在括号中。

它有什么作用,如何使用?


3
关于“它用来获取本文中数组长度的信息”,一点也不。my至少没有考虑到它。标量赋值运算符(=)强制在上执行标量上下文@arr
ikegami 2014年

如果它不是真正的“您的人”,则不应使用它。
icenac '17

Answers:


139

my限制变量的范围。可以看到变量的范围。将变量的范围缩小到需要变量的位置是良好编程的基本方面。它使代码更具可读性,并且不易出错,并带来了很多好处。

如果不使用声明变量my,则会创建一个全局变量。这是要避免的。using use strict;告诉Perl,您希望避免隐式创建全局变量,这就是为什么您应该始终在程序中使用use strict;(和use warnings;)的原因。


相关阅读:为什么使用use strict;use warnings;


10
最后一个答案解释了为什么
ThisSuitIsBlackNot

对于来自JS的人:本质上var和JS相似let。如果没有'use strict';JS,则可以不使用任何关键字声明新的全局变量,这不是最佳实践。
电咖啡

@Electric Coffee,用JS术语来说,问题是“ 它们的作用letvar作用以及应如何使用它们?” 是的,答案将大致相同。(JS的let变量与Perl的my变量很像,只是let无法捕获变量。)
ikegami

我的意思是,如果人们从JS来到Perl,这将是一个简单的方法来解释相同的概念
Electric Coffee

@ElectricCoffee 1)知道范围的程序员不需要在切换语言后再次向他们解释。2)不确定您是否确实以JS程序员会理解的方式解释了作用域。也许您正在尝试解释use strict;?但这不是问题,use strict;它的作用远不止于此。或者,也许您想传达的信息会my限制vars的使用范围letvar行为,但这几乎是答案的第一句话。3)如果您希望以不同的方式回答问题,那就是答案。
池上

27

快速总结: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请看

(由于ThisSuitIsBlackNot)。


想要解释“他们”吗?我总是发现那些令人困惑。
rdodev

@rdodev:你什么意思?
伊戈尔·楚宾

在实践中,我一直看到同时带有“ my”和“ their”的perl代码,但从未完全理解它们之间的区别。
rdodev

@rdodev:能否请您发送给我一些代码的链接their
Igor Chubin 2014年

3
@rdodev我想你的意思是ourstackoverflow.com/questions/845060/...
ThisSuitIsBlackNot

4

通过my()的私有变量是的主要文档my

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.