3

したがって、私の目標は、フラグを使用して Perl で print ステートメントをオンにする簡単な方法を見つけることです。C/C++ では、#define を使用して特定のコードを実行するかどうかを選択できます。これは、デバッグ印刷ステートメントをオンまたはオフにする方法です。#define DEBUG が定義されている場合は、何かを出力します。それ以外の場合は、print ステートメントなしで実行します。Perlでこれを行う簡単な方法があるかどうか疑問に思っていました.

これがどのように機能するかの例を次に示します。

for($i = 0 ; $i < 10; $i++){
    if(debug flag){
         print some info;
    }
    do operational stuff.
}

コマンドラインから、次の 2 つのいずれかを実行できます。

1.デバッグ印刷ステートメントなしで実行します

perlScript.pl 

2.デバッグ印刷ステートメントで実行します

perlScript.pl -debug

または、誰かがより良いアイデアを持っている場合は、私に知らせてください!

4

5 に答える 5

3

perl では、コンパイル時は実行時でもあります。#defineしたがって、型ステートメントを使用する利点はあまりありません。

私の通常のトリックは次のとおりです。

my $debug = 0; 
$debug += scalar grep ( "-d", @ARGV ); 

GetOpt正直なところ、おそらくより良い計画ですが)

そして、次を使用します。

print if $debug;
print $statement if $debug > 2;

つまり、冗長性を設定する簡単な方法があり、ステートメントをインクリメントすることで冗長性を選択することもできます。

シグナルハンドラを埋め込んでデバッグレベルを調整することもあります -

#!/usr/bin/perl

use strict;
use warnings;

my $debug = 0; 
$debug += scalar grep ( "-d", @ARGV ); 

$SIG{'USR1'} = { $debug++ };
$SIG{'USR2'} = { $debug-- };

while ( 1 ) {
    print "Debugging at: $debug\n";
    sleep 1;
}

それは、私がどのような種類のコードを書いているかという問題です。この後者はfork、y の作業を行うときに特に気に入っています。なぜなら、各フォークのデバッグ レベルを個別に、その場で調整できるからです。

于 2015-06-23T16:24:24.753 に答える
1

私は通常、Log::Log4perlを介してスクリプトにログインするために次のボイラープレートを使用します。コマンドラインからログベース/ログ構成の場所をオーバーライドできます (または、より一般的には、デプロイ時に適切な場所をデフォルトとして設定します)。スクリプトに 1 つ以上の -verbose フラグを指定すると、そのログをオーバーライドして画面にログを記録します。画面出力を提供する4つの詳細。これにより、詳細なフラグを指定してすべてのログ出力を取得することによるデバッグから、それをカスタム ログ ハンドラー構成に渡してサブシステムをデバッグすること、本番デプロイでログを設定することまで、最小限のコード変更またはコード変更なしで簡単に移行できます。

use Getopt::Long;
use Pod::Usage;
use Log::Log4perl qw/:easy/;

my $opts = { logconf        => undef,
             logbase        => 'corp.team.app.appname'
             debug          => 0,
           };

GetOptions ( 'logconf|l=s'       => \$opts->{logconf},
             'logbase=s'         => \$opts->{logbase},
             'verbose|v+'        => \$opts->{debug},  ### debug levels - 0 = off (default), 1 = error, 2 = warn, 3 = info, 4 = debug.
                                                      ### Ignored if a logconf is provided.
           ) or pod2usage(0);

### Initialize logging subsystem
init_logger();

### Usage
logger('app_subsystem')->info('some message...');
logger()->debug('debug message...');


### Initialize logging system
sub init_logger {
    ### If a log configuration is found, and debug was not set, use it
    if (        $opts->{logconf}
         and -e $opts->{logconf}
         and  ! $opts->{debug}
       ) {
        Log::Log4perl->init($opts->{logconf});
    }
    ### Otherwise fall through to easy_init a screen logger based on the verboseness level
    ### Logging off if no config found and no verboseness set
    else {
        my ($min, $max) = ( 0, 4 );
        my %levels;
        @levels{$min .. $max} = ( $OFF, $ERROR, $WARN, $INFO, $DEBUG );
        my $log_level = $opts->{debug};
        if ($log_level < $min) {
            $log_level = $min;
        }
        elsif ($log_level > $max) {
            $log_level = $max;
        }
        Log::Log4perl->easy_init($levels{$log_level});
    }
}

### Shorthand shim sub to get a logger
### Always returns a Log::Log4perl logger object
sub logger {
    my ($category) = @_;
    if ($category) {
        return Log::Log4perl->get_logger($opts->{logbase} . '.' . $category);
    }
    return Log::Log4perl->get_logger($opts->{logbase});
}
于 2015-06-23T16:41:51.477 に答える
1

あなたの考えに似ていますが、より簡潔でstderrに行き、Getopt::Longのようなものを使用してデバッグCLIオプションを設定すると仮定します。

warn "debug info:..." if ( $debug );
于 2015-06-23T16:20:24.137 に答える