3

目前,在调试期间,我倾向于插入

carp Dumper \@foo, \%bar;

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

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

所以现在我可以做

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

到处都是,但main::让我很恼火。是否有类似全局包的东西总是自动导入到任何包中(就像内置插件实际上在任何地方都导入一样)?

4

3 回答 3

4

你可以叫它

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

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

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

例如,您可以在单个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 Smart::Comments;
于 2012-08-15T12:38:03.067 回答
1

也许更好地用导出和需要的东西制作另一个包?就像,MyTest.pm:

package MyTest;

use strict;
use Carp;
use Data::Dumper;


use base qw( Exporter );
our @EXPORT = qw(
    debug
)

sub debug {
    carp Dumper @_;
}

1;

所以你可以在你的脚本中写:

use MyTest;

debug {a => 'b', c => 'd' }
于 2012-08-15T13:03:26.413 回答
0

有趣的事实:有些符号很神奇,因为它们总是引用它们在main包中的值。您可以为这些符号分配子例程,它们将在任何包中可见。

{
    package Foo;

    # special names _ ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT
    sub ENV { print "In main::ENV ...\n" }
    sub STDIN { print "In main::STDIN ...\n" }
    sub _ { print "In main::_\n" }

    # names that begin with ^ + upper case letter, or all digits
    *{^T} = sub { scalar localtime };
    *{^Gmtime} = sub { scalar gmtime };
    *43 = sub { 42 };

    use Data::Dumper;
    *{^D} = \&Data::Dumper::Dumper;
}

{
    package Bar;
    &ENV;


    STDIN();
    print "The time is ", &^T, "\n";
    print "In London it is ", &{^Gmtime}, "\n";
    print "The answer is ", &43, "\n";

    print "\@foo is ", &^D( \@foo );
}

不建议这样做,除非您想让下一个维护您的代码的人发疯。

于 2012-08-15T15:50:57.907 回答