perl - 使用匿名 subs 最小化 Perl 中的子范围是一种好习惯吗?

标签 perl scope anonymous-function subroutine anonymous

假设我有 sub1() 和 sub2()。 sub2 仅从 sub1 调用。使用匿名 sub 来最小化 sub2 的范围,以便只有 sub1 可以看到 sub2 是好的做法吗?

示例 1(范围未最小化):

sub sub_called_only_in_calc {
    #do s.th
    #return s.th
}

sub calc {
    my $n = sub_called_only_in_calc(1,2,3);
    #...

    return $n;
}

示例 2(使用匿名子最小化范围):

sub calc {
    #my or state
    my $sub_called_only_in_calc = sub {
        #do s.th
        #return s.th
    };

    my $n = $sub_called_only_in_calc->(1,2,3);

    #or

    #my $n = sub {
        #do s.th
        #return s.th
    #}->(1,2,3);

    return $n;
}

最佳答案

不同的人会有不同的意见,但我的意见是,在限制访问很重要的情况下,使用词法标量来本地化对子例程的访问可能是一种有用的技术;例如,当这些子例程可能被未经授权的人恶意调用时,通常是通过网页。

如果您考虑这样做只是为了防止编码错误(调用错误的子例程)或允许多个子例程具有相同的标识符,那么我会说您是在浪费时间。无论如何,前者是一个可以忽略不计的问题,我怀疑这项措施不会显着减少;而后者通常应该使用包来实现:这就是它们的设计目的。

大多数 Perl 模块通过在子例程标识符前加下划线来限制仅隐式访问。

记住拉里的这句话

Perl doesn't have an infatuation with enforced privacy. It would prefer that you stayed out of its living room because you weren't invited, not because it has a shotgun

虽然 Larry 的许多原始想法可以被认为与后来的 Perl 版本无关,但我认为这一个仍然有效。

关于perl - 使用匿名 subs 最小化 Perl 中的子范围是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22094939/

相关文章:

perl - 可以连接两个使用不同输入记录分隔符的 Perl 脚本吗?

javascript - 匿名javascript轮询函数不会立即触发setTimeout ajax调用

javascript - 如何使用 jsdoc-toolkit 记录匿名函数(闭包)

scope - 在 if 语句中使用全局声明(Julia 代码)

ruby - ruby 模块中的模块函数、实例方法和类方法有什么区别?

variables - Golang 切换变量作用域

javascript - 我应该将功能 block 封装在匿名 JavaScript 函数中吗?

perl - 使用 chomp() 时打印失败

perl - 如何在 Perl 中重命名导出函数?

jquery,选择所有选项按钮在 IE 中不起作用,但在 Firefox 中起作用