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

以前は、ユーティリティ関数をUtパッケージに入れていました。それは問題ありませんでしたが、コードが思ったほどモジュール化されていないことに気付きました。そこにある関数に依存する各モジュールUtは、誰かがその名前空間を構築するのに苦労した場合にのみ成功する可能性があります。

最終的に、useandrequireステートメントは単に依存関係を文書化するものであると考えました。main での実装を変更するよりも、ライブラリ モジュールによって呼び出されるコードを変更するより柔軟な方法があります。

たとえば、これを 1 つの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

必要なのは 1 つの use ステートメントだけです。

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 に答える