目前,在调试过程中,我倾向于插入
carp Dumper \@foo, \%bar;
语句到我的代码中,经常遇到 Carp
和 Data::Dumper
没有导入当前包的问题。为了避免这个问题,我在一个始终包含的中央文件中定义了以下子文件:
sub main::bla {
use Carp; use Data::Dumper;
carp Dumper @_;
}
现在我可以做
main::bla \@foo, \%bar;
无处不在,但是 main::
让我很烦。有没有像全局包这样的东西,它总是在任何包中自动导入(就像内置函数几乎在任何地方都被导入一样)?
最佳答案
你可以直接调用它
::bla( \@foo, \%bar );
早些时候,我习惯于将 util 函数放在 Ut
包中。这很好,但我注意到我的代码并不像我想象的那样真正模块化。每个依赖于 Ut
函数的模块只有在有人不厌其烦地构建那个命名空间时才能成功。
最后,我认为 use
和 require
语句只是记录依赖关系。有更灵活的方法来更改库模块调用的代码,而不是更改它们在 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/