1

私は現在、Perlでコマンドライン引数を使用してデバッグフラグを設定しようとしていますが、非常に簡単だと思っていた問題が発生しているようです。

    my $debugvalue;

    my $file = $ARGV[0] or die;

    if ($ARGV[1] == "debug")
    {
        $debugvalue = 1;
    }else
    {
        $debugvalue = 0;
    }

ファイルの後に、フラグを0に設定しない場合は、純粋にデバッグという単語を入力しようとしています。

test.pl file.txt debug
  • フラグを1に設定します

    test.plfile.txtデバッグ

  • フラグを0に設定します

入力されたものを除いて、これをどのように行うかを想定します。これは常にifの最初の部分にドロップされ、フラグが1に設定されます。

4

4 に答える 4

5

eqこれは問題なく機能しますが、数値比較ではなく、文字列比較を使用する必要があります==

if ($ARGV[1] eq "debug")

また、それを次のように短縮することもできます。

my $debugvalue = $ARGV[1] eq "debug";

ただし、一般的には、デバッグ設定には環境を使用することを好みます。

my $debugvalue = $ENV{DEBUG} || 0;

次に、次のようなことができます。

DEBUG=1 test.pl file.txt

または、bashまたはzshで実行するたびにテストをオンに設定します。

export DEBUG=1
test.pl file.txt
test.pl file2.txt
test.pl file3.txt

または、特定の問題の診断に役立つ積極的なデバッグ出力が必要な場合は、複数のデバッグレベルがあります。

DEBUG=3 test.pl file.txt

そしてあなたのコードで:

warn "Fiddly Detail $x\n" if $debugvalue > 2;
于 2012-08-14T16:32:41.360 に答える
4

私はほとんどの場合、GetoptまたはGetopt::Longを使用します。どちらもCPANで、非常に使いやすく、非常に標準化されています。例えば:

#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;

my $debug = 0;

my $result = GetOptions(
    debug => \$debug
);

my $file = shift;

if ( $debug ) {
    print( "debug is on for processing $file..." );
}

もちろん、標準の構文を使用しているため、次のように呼びます。

#> test.pl file.txt --debug

また

#> test.pl --debug file.txt

- - 編集 - -

@zostayは良い点を示しています。さまざまなレベルでのデバッグは、非常に便利です。これをGetopot::Longアプローチに追加すると、次のようになります。

#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;

my $debug = 0;

my $result = GetOptions(
    "debug+" => \$debug
);

my $file = shift;

if ( $debug > 2 ) {
    print( "debug is at least level 2 for processing $file..." );
}

また、レベル2のデバッグでは、次のように呼び出されます。

#> test.pl --debug --debug file.txt

于 2012-08-14T16:37:52.923 に答える
3

eqnotを使用して文字列比較を行う必要があります==

if ($ARGV[1] eq "debug")
于 2012-08-14T16:30:18.097 に答える
1

文字列の比較やデバッグ機能をサポートする他の方法には「eq」を使用する必要があることを人々はすでに指摘しているので、私が追加する他の唯一の提案は、開発中にperlの-w(警告)フラグを使用することも見つけるのに役立つということですあなたのような問題:

#!/usr/bin/perl -w

最初の例では、次のような警告が返されます。

引数「debug」は、。/ foo.pl行7のnumericeq(==)の数値ではありません。

比較に使用する前に、$ARGV[1]の存在を確認する方がクリーンな場合もあります。

if ($ARGV[1] && $ARGV[1] eq "debug")
{
    $debugvalue = 1;
...
于 2012-08-14T17:06:45.897 に答える