2

スクリプトに出力の送信先のオプションを与えるためのロジックを考え出そうとしています。

これは私が書き始めたテスト スクリプトであり、2 つのオプションの組み合わせを考えようとして途方に暮れ始めました。私はこれを考えすぎていることを知っています。

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $output = 0;

my $logfile = '';

GetOptions(

    'o' => \$output,
    'l' => \$logfile

);

if (($output == 1) && (! $logfile eq '')){



} elsif (($output == 0)($logfile eq '')){



}

これが役に立つなら、私のゲストになってください。

かなり私は3つのオプションが欲しい

0 = オフ 1 = 標準出力 2 = ログファイル

カスタムログファイル引数を追加したい場合、私は自分自身に少しレンチを投げました。2つの引数を同じ引数に結合できないという印象を受けていますか?

出力を書き込む場所はif、条件に基づいて単純なステートメントで制御します。最初のインタラクションでは、stdout への出力のみを許可します。-oオプションを使用して0orを指定しただけ1です。1 の場合は行を書き込み、0 の場合は書き込みません。

上記の解決策よりも簡単な解決策があれば、私は何でも受け入れます。

前もって感謝します。

4

3 に答える 3

3

$verboseオプションとして、およびオプションとして使用します$logfile。したがって、$verboseが設定されている場合$logfileは印刷し、 が設定されている場合はログに印刷します。

次に使用します。

if ($logfile) {
    open STDOUT, '>', $logfile or die $!;
}
print "Yada\n" if $verbose;

または簡単にするために:

sub myprint {
    return unless $verbose;
    print @_;
}
myprint("Yada\n");
于 2011-05-22T23:15:50.487 に答える
3

TLP の流れで、a$verbose$logfileオプションを提案します。使用$verboseする場合は、暗黙的に true に設定することもお勧めします$logfile。通常どおりコマンド$verboseを制御するために使用します。print大きな魔法は、ファイルハンドルが指定されていない場合に出力を送信selectする場所を制御するために使用することです。print

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $verbose = 0;
my $logfile;

GetOptions(

    'verbose' => \$verbose,
    'logfile=s' => \$logfile,

);

if (defined $logfile) {
  $verbose = 1;
  open my $log_handle, '>', $logfile or die "Could not open $logfile";
  # select makes print point to LOGFILE 
  select($log_handle);
}

# do stuff

print "Stuff" if $verbose;

また、Getopt::Long長いオプションを提供するので、オプション名を人間が読める形式のverboseとに変更しましたが、好みに応じてlogfile短いもの-vや長いものを使用できます。--verbose

于 2011-05-22T23:28:16.293 に答える
0

まず、この構文が間違っている場合はご容赦ください。私がperlをやったのは久しぶりなので、これを「私の答えをコピーして貼り付ける」というよりも「このようなことをする」と考えてください。そうは言っても、私はおそらくこれを行うでしょう:

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $output = 0;
my $logfile = '';

GetOptions(

    'o' => \$output,
    'l' => \$logfile

);

if (($output == 1) && (! $logfile eq '')){
    open STDOUT, $logfile
} elsif (($output == 0)($logfile eq '')){
    open STDOUT, "/dev/null"
}

... (do stuff normally here)

私が行っているのは、STDOUT をログ ファイルに送信するか、/dev/null

于 2011-05-22T23:15:39.280 に答える