我在Stackoverflow和Google中读过许多帖子,告诉我
local
不会创建变量,而是在现有变量上运行.
我在下面有一小段代码,我想知道当没有创建这样的变量时本地是如何工作的.
#use strict; #use warnings; &func; sub func{ local $temp = 20; print $temp; }
我写这篇文章只是为了理解这个概念而且我对Perl来说相对较新.
解决方法
除非您使用my声明变量,否则没有完整包规范的变量将进入当前包.以下是您第一次看到变量的用法以及它们的用途:
my $temp; # a scoped,lexical variable that does not live in any package state $temp; # a persistent lexical variable our $temp; # a package variable in the current package,declared $temp; # a package variable in the current package $main::temp # a package variable in main $Foo::Bar::temp # a package variable in Foo::Bar local $temp # a package variable in the current package,with a dynamically-scoped (temporary) value
local设置包变量的范围.声明此“动态”作用域时,Perl使用您设置的临时值,直到作用域结束.与其他包变量一样,Perl在您第一次使用它们时会创建它们.您可以先在本地使用它,但不会影响它.
许多试图回答你问题的人立刻唠叨你严厉.这是一个编程辅助工具,它可以帮助您通过强制声明要使用的所有变量来错误输入变量名.当您使用未声明的变量名时,它会停止编译您的程序.你可以使用vars pragma,my,state或者我们的:
use vars qw($temp); our $temp; my $temp; state $temp;
正如你所见,本地不是其中的一部分.为什么?因为那就是它的样子.如果不同的话,我会更喜欢它.
如果使用完整的包规范,严格不会抱怨,例如$Foo :: Bar :: temp.你可以错误地输入所有这些,而不会注意到.
我主要保留我对Perl的特殊变量使用local,你不必声明.如果我想在子例程中使用$_,也许是为了使用默认使用$_的运算符,我可能会从本地$_开始:
sub something { local $_ = shift @_; s/.../.../; tr/.../.../; ...; }
我可能更频繁地使用本地输入记录分隔符,所以我可以使用不同的行结尾而不影响之前的可能:
my $data = do { local $/; <FILE> };
那些工作是因为隐含的第一次使用那些你没见过的变量.
否则,我可能希望将变量设置为其子例程的私有,因此子例程之外的任何内容都无法看到它.在这种情况下,我不希望程序的其余部分可以读取或写入的包变量.这是我变量的工作:
sub something { my $temp = ...; }
编程的诀窍是限制你想要的东西.如果您的程序的其余部分无法查看或更改变量,那么我就是您的选择.
我解释这是Learning Perl并在Mastering Perl中写了包变量的细节.