我看到他们都在这个剧本我试图调试使用,文学是不明确的。 有人可以揭穿这给我吗?
Answer 1:
动态作用域。 这是一个整洁的概念。 很多人不使用它,或理解它。
基本上认为的my
创建和锚定变量的一个块{},AKA范围。
my $foo if (true); # $foo lives and dies within the if statement.
所以my
变量是你所习惯的。 而使用动态作用域是$ var可以在任何地方声明,在任何地方使用。 因此,与local
,你基本上暂停使用的是全局变量,并使用“本地值”与它合作。 所以local
创建一个临时变量具有临时范围。
$var = 4;
print $var, "\n";
&hello;
print $var, "\n";
# subroutines
sub hello {
local $var = 10;
print $var, "\n";
&gogo; # calling subroutine gogo
print $var, "\n";
}
sub gogo {
$var ++;
}
这应该打印:
4
10
11
4
Answer 2:
简短的回答是, my
标记在词法范围的变量为私有,和local
标志在动态范围的变量为私有。
这是容易理解my
,因为这会在通常意义上的局部变量。 有创造了一个新的变量,它只能在封闭的词汇块,这通常是由大括号标注的访问。 也有一些例外的花括号规则,如:
foreach my $x (@foo) { print "$x\n"; }
但是,这只是Perl的做你的意思。 通常情况下,你有这样的事情:
sub Foo {
my $x = shift;
print "$x\n";
}
在这种情况下, $x
是私有的子程序,其范围由大括号括起来。 事情要注意,这是对比于local
,是一个范围my
变量相对于定义你的代码,因为它是写在文件中。 这是一个编译时的现象。
要了解local
,你需要的,因为它是运行在想你的程序的调用堆栈的条款。 当一个变量是local
,它是从该点重新确定local
执行语句下面,一切都在栈上,直到您返回到堆栈包含了块的主叫local
。
这可以在第一是混乱的,所以考虑下面的例子。
sub foo { print "$x\n"; }
sub bar { local $x; $x = 2; foo(); }
$x = 1;
foo(); # prints '1'
bar(); # prints '2' because $x was localed in bar
foo(); # prints '1' again because local from foo is no longer in effect
当foo
被称为第一次,它看到的全球价值$x
是1,当bar
被调用, local $x
运行,重新定义了全球$x
在堆栈中。 现在,当foo
是从所谓的bar
,它看到的2新价值$x
。 到目前为止,这是不是很特别,因为同样的事情会发生,而不调用local
。 神奇的是,当bar
的回报,我们退出由创建的动态范围local $x
和以前全球$x
回来到范围。 所以对于最终调用foo
, $x
为1。
你将几乎总是想用my
,因为这给了你,你要找的局部变量。 一旦在一个蓝色的月亮, local
实在是太好做很酷的事情。
Answer 3:
从报价学习Perl的 :
但是当地被错误命名,或至少误导命名。 我们的朋友奇普·萨泽伯格说,如果他得到一个机会回到时光机到1986年,给拉里一个忠告,他会告诉拉里调用由本地名“保存”来代替。[14] 这是因为当地的实际节省给定的全局变量的值了,所以它会自动以后恢复到全局变量。 (这是正确的:这些所谓的“局部”变量实际上是全局!)这个保存和恢复机制,我们已经看到了两次,现在,在foreach循环的控制变量相同的一个,并在@_阵列的子程序参数。
因此, local
保存一个全局变量的当前值,然后将其设置为某种形式的空值。 你会经常看到它用来啜整个文件,而不是仅仅领先的一行:
my $file_content;
{
local $/;
open IN, "foo.txt";
$file_content = <IN>;
}
调用local $/
设置输入记录分隔符为空值,导致飞船操作读取整个文件(Perl的停止读取“线”的值),所以它永远不会碰到输入记录分隔符。
Answer 4:
我不能相信没有人挂马克·杰森·多明斯对此事详尽的论文:
与作用域应对
事后,如果你想知道什么
local
是好的毕竟,
七种有用的用途local
Answer 5:
http://perldoc.perl.org/perlsub.html#Private-Variables-via-my()
与当地运营商创建的动态变量,词法变量与我是完全与外界隐藏,包括任何调用的子程序声明。 这是真实的,如果它是来自自身或其他地方被称为相同的子程序 - 每一个电话都有自己的副本。
http://perldoc.perl.org/perlsub.html#Temporary-Values-via-local()
本地修改其上市的变量是“本地”的封闭块,EVAL,或选择File - 并且从该块内调用的任何子程序。 当地只是给临时值到全球(指包)变量。 它不创建一个局部变量。 这被称为动态作用域。 词法作用域与我做,其工作更类似于C的自动申报。
我不认为这是不是说,通过“局部封闭块”的说法不明确,另一方面,它的意思是,当退出块的原始值将被恢复。
Answer 6:
那么谷歌真的适合你的就这一个: http://www.perlmonks.org/?node_id=94007
从链接:
快速总结:“我的”创建一个新的变量,“本地”临时修改了一个变量的值。
即,“本地” 暂时改变可变的值 ,但是只有它存在于范围内 。
一般用我的,它的速度更快,并没有做任何事情很怪。
Answer 7:
从man perlsub
:
与当地运营商创建的动态变量,词法变量与我是完全与外界隐藏,包括任何调用的子程序声明。
所以,简单化, my
让你的变量可见只有在它的声明。 local
使它可见下来调用堆栈过。 通常你会想用my
,而不是local
。
Answer 8:
你的困惑是可以理解的。 词汇范围是相当容易理解,但动态作用域是一个不寻常的概念。 这种情况是由名字变得更糟my
和local
是有些不准确(或至少不直观的)历史原因。
my
声明一个词法变量-一个是从声明的点,直到封闭块(或文件)的端部是可见的。 它是从与程序的其他部分相同名称的任何其他变量完全独立的。 它是私有的该块。
local
,而另一方面,宣告一个全局变量的值临时改变。 这种变化在封闭范围内的结尾处结束,但是变量 - 是全球性 - 随时随地可见该计划。
作为一个经验法则,用my
声明自己的变量和local
控制变化的Perl的内建变量的影响。
有关更详尽的描述,请参阅马克·杰森·多明斯文章与作用域应对 。
Answer 9:
当地是本地化的旧方法,从当Perl的只有动态作用域的时间。 词法范围在很多情况下更自然的编程和更安全。 我的变量属于它们所宣称的范围(块,包或文件)。
局部变量,而不是实际上属于一个全局命名空间。 如果引用变量$ X与地方,你实际上是指$主:: X,这是一个全局变量。 相反的是它的名字所暗示的,所有的地方确实是推一个新的值到了$主:: X堆栈值,直到该块,此时旧值将恢复的结束。 这是在其本身也是一个有用的功能,但它不具有的原因有主机局部变量(认为当你有线程会发生什么!想想,当你调用真正想使用一个全球性的一个常规发生了什么好办法你已经本地化!)。 但是,它是有一个看起来像本地变量早在坏日子我们还是坚持了下来的Perl 5之前变量的唯一途径。
Answer 10:
“我的”变量只在当前代码块可见。 “局部”变量也是在以往任何时候,因为以前他们看见可见。 例如,如果你说“我的$ X;” 并调用子功能,不能看到变量$ X。 但如果你说“当地$ /;” (来清零记录分隔的值),那么你改变从文件中读取调用任何功能的工作方式。
在实践中,你几乎总是需要“我”,而不是“本地”。
Answer 11:
看看下面的代码并将其输出到理解上的差异。
our $name = "Abhishek";
sub sub1
{
print "\nName = $name\n";
local $name = "Abhijeet";
&sub2;
&sub3;
}
sub sub2
{
print "\nName = $name\n";
}
sub sub3
{
my $name = "Abhinav";
print "\nName = $name\n";
}
&sub1;
输出是:
Name = Abhishek
Name = Abhijeet
Name = Abhinav
Answer 12:
使用本地重新定义记录定界符的dinomite的例子是我在很多的Perl编程跑过的唯一一次。 我住在一个利基Perl环境[安全程序],但它确实是在我的经验很少使用范围。
Answer 13:
&s;
sub s()
{
local $s="5";
&b;
print $s;
}
sub b()
{
$s++;
}
上述脚本打印6。
但是,如果我们换个地方我会打印5。
这就是区别。 简单。
Answer 14:
我想记住它的最简单的方法是这样的。 我创建了一个新的变量。 LOCAL暂时更改现有变量的值。