出力をログファイルまたはSTDOUTに送信する

logfile perl stdout
出力をログファイルまたはSTDOUTに送信する

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

これは、私が書き始めたテストスクリプトであり、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`オプションを使用して、 0`または `1`を指定しました。 1の場合は行を書き、0の場合は書きません。

上記のものよりも簡単な解決策がある場合は、私は何にでもオープンです。

前もって感謝します。

  2  0


ベストアンサー

オプションとして $ 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");

3


TLPの流れでは、「$ verbose」と「$ logfile」オプションをお勧めしますが、「$ logfile」を使用する場合は、「$ verbose」を暗黙的にtrueに設定することもお勧めします。 通常どおり、「$ verbose」を使用して「print」コマンドを制御します。 大きな魔法は、http://p3rl.org/select [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」を使用できます。

3


まず、この構文が間違っている場合はご容赦ください。 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)

私がしているのは、ログファイルに送信するか、 `/ dev / null`に送信することにより、STDOUTの場所を変更すること

0


タイトルとURLをコピーしました