perl - 我可以定义一个可以像内置函数一样在任何地方调用的子程序吗?

标签 perl subroutine global

目前,在调试过程中,我倾向于插入

carp Dumper \@foo, \%bar;

语句到我的代码中,经常遇到 CarpData::Dumper 没有导入当前包的问题。为了避免这个问题,我在一个始终包含的中央文件中定义了以下子文件:

sub main::bla {
    use Carp; use Data::Dumper;
    carp Dumper @_;
}

现在我可以做

main::bla \@foo, \%bar;

无处不在,但是 main:: 让我很烦。有没有像全局包这样的东西,它总是在任何包中自动导入(就像内置函数几乎在任何地方都被导入一样)?

最佳答案

你可以直接调用它

::bla( \@foo, \%bar );

早些时候,我习惯于将 util 函数放在 Ut 包中。这很好,但我注意到我的代码并不像我想象的那样真正模块化。每个依赖于 Ut 函数的模块只有在有人不厌其烦地构建那个命名空间时才能成功。

最后,我认为 userequire 语句只是记录依赖关系。有更灵活的方法来更改库模块调用的代码,而不是更改它们在 main 中的实现。

例如,您可以在单个 use 语句中执行此操作。

use Ut blah => sub { 
    use Carp; 
    use Data::Dumper;
    carp Dumper @_;
};

并定义导入:

sub import { 
    shift; # It's just me
    my ( $name, $impl ) = @_;
    if ( $name eq 'blah' && ref( $impl ) eq 'CODE' ) { 
        *blah = $_[1];
    }
    ...
}

当我同时开发大量代码时,我仍然使用 ut 模式。但我不介意写

ut:dump_var( $var )

而不是保存 3-4 个字符(因为有时我称之为 U::)。

现在看来,您不想长期这样做,转储变量对于开发来说是一件有用的事情。如果你真的想这样做,Smart::Comments是这样吗:

### @foo
### %bar

只需要一个 use 语句。

use Smart::Comments;

关于perl - 我可以定义一个可以像内置函数一样在任何地方调用的子程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11969064/

相关文章:

Perl select 函数无限期挂起

perl - 我如何检查子例程是否返回 *nothing*

Cakephp - 在 View 和 Controller 中可访问的一个变量

perl - Catalyst:如何声明一个全局子程序

batch-file - 恢复之前的回声状态

javascript - 从 Electron 调用窗口函数

codeigniter - CodeIgniter 中的全局变量不起作用

arrays - 如何删除数组的前五个元素?

perl - 在运行时使 Perl 打印?

XML::XML2JSON "0"元素