在Perl中,变量的作用域由关键字my和local决定。
my创建一个具有词法作用域的变量(仅在当前块内有效)。local暂时保存全局变量的当前值,并在块存在期间设置一个新值——通常仅与全局变量一起使用(例如,$_,$/等)。示例:
my $x = 42; # 仅在当前块内可见 { local $/ = undef; my $input = <STDIN>; # $/在这里是undef,块结束后恢复值 }
因为更可预测的作用域,使用my更为推荐。
当在两个不同块中使用同一变量时,my和local会发生什么?
人们常常回答
local和my的工作方式是一样的,但事实并非如此。local仅对全局变量有效(包变量)。通过my声明的变量对于local是不可见的。
示例:
our $foo = "global"; { local $foo = "local"; print $foo; # "local" } print $foo; # "global" { my $foo = "lexical"; } # 在块外的$foo——全局变量,不是"lexical"
故事
在脚本中使用local临时替换通过my声明的变量,导致没有任何结果,并在某个内部模块中的事件处理上引发了bug。
故事
在项目中通过local在foreach内部“本地化”了$,期待替换迭代器的$,却忘记了foreach已经设置了一个新的$_。结果是——过滤器无法工作,迭代逻辑错误。
故事
包的全局变量没有通过our声明,而尝试通过local $var进行本地化导致由于strict和warning而使脚本崩溃,调试耗时一天。