Отправка вывода в лог-файл или STDOUT - PullRequest
2 голосов
/ 23 мая 2011

Я пытаюсь придумать некоторую логику, чтобы дать моему сценарию возможность отправлять вывод.

Это тестовый сценарий, который я начал писать, я начал выдыхаться, пытаясь придуматьсочетания двух вариантов.Я знаю, что слишком много обдумываю.

#!/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 = off 1= stdout 2 = logfile

Где я немного разболтал себя, если захотел добавить собственный аргумент в лог-файл.У меня сложилось впечатление, что я не могу объединить 2 аргумента в один и тот же аргумент, не так ли?

Места, в которых у меня будет выход для записи, я буду контролировать с помощью простых if отчетов, основанных на условии, вмое первое намерение, которое позволяет выводить на стандартный вывод.Я просто использовал опцию -o и указал 0 или 1.Если это был 1, он написал строку, если это было 0, то этого не было.

Если у кого-то есть более простое решение, чем приведенное выше, я открыт для всего.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 23 мая 2011

Я бы использовал $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 голосов
/ 23 мая 2011

В духе TLP я предлагаю варианты $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 на свой вкус.

0 голосов
/ 23 мая 2011

Хорошо, прежде всего, прости меня, если этот синтаксис неправильный. Это было ДОЛГОЕ время с тех пор, как я сделал любой 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

...