在Perl中使用自调用匿名函数是一个好习惯吗?

Igo*_*zov 2 perl

在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)

Vec*_*oth 6

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的答案,了解与自我调用匿名潜艇相关的资源相关优势.