在JavaScript中使用自调用匿名函数来扩展变量等是一种常见做法:
;(function() {
...
})();
Run Code Online (Sandbox Code Playgroud)
在Perl中使用这些函数是一个好习惯吗?
(sub {
...
})->();
Run Code Online (Sandbox Code Playgroud)
或者出于某种原因使用主子程序更好?
sub main {
...
}
main();
Run Code Online (Sandbox Code Playgroud)
Perl有JS缺乏的词法范围机制.你最好简单地将你想要作用域的代码封装在一个块中,例如:
{
my $localvar;
. . .
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,$localvar在那些牙箍之外将是完全不可见的; 这也是可用于本地化内置变量的相同机制,例如$/:
{
local $/ = undef;
#reading from a file handle now consumes the entire file
}
#But not out here
Run Code Online (Sandbox Code Playgroud)
(旁注:永远不要$/全局设置.如果你在完成后忘记将其设置回来,或者在恢复之前调用其他代码,它会以微妙和可怕的方式破坏事物.)
在perl中,最好的做法是在有意义的时候将东西放入子中; 当它没有意义或不必要地使代码复杂化时,词汇块确保范围; 如果你确实需要匿名子程序(通常用于回调或类似),那么你可以做my $subref = sub { . . . };甚至只是将子声明直接粘贴到函数参数中:do_something(callback => sub { . . . });
注意:另请参阅ysth的答案,了解与自我调用匿名潜艇相关的资源相关优势.