Как проверить, какие флаги были прочитаны, используя Getopt :: Long в Perl? - PullRequest
1 голос
/ 07 сентября 2010

myscript.pl

my $R;
my $f1 = "f1.log";
my $f2 = "f2.log";
my $f3 = "f3.log";

sub checkflags {

    GetOptions('a=s'    => \$f1,
               'b=s'    => \$f2,
               'c=s'    => \$f3,
    );

    open $R, '>', $f1 or die "Cannot open file\n"; # Line a
}
  • Все флаги являются необязательными.

  • Если я назову скрипт как

    perl myscript.pl -a=filename
    

    Мне нужно добавить .log к имени файла, прежде чем открывать его в Line a.

  • Для этого мне нужно знать, GetOptions читает что-то в $f1 или нет.

Как это можно сделать?

Ответы [ 4 ]

2 голосов
/ 07 сентября 2010

Самое простое решение - найти /[.]log$/ в $f1 и добавить его, если его нет.К сожалению, это означает, что когда пользователь переходит в "foo.log" и хочет, чтобы он стал "foo.log.log", этого не произойдет, но я думаю, мы можем согласиться с тем, что пользователь - придурок.

Лучший вариант, который сделаетсчастливый придурок:

#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;

GetOptions(
    'a=s'    => \my $f1,
    'b=s'    => \my $f2,
    'c=s'    => \my $f3,
);

if (defined $f1) {
    $f1 .= ".log";
} else {
    $f1 = "f1.log";
}

print "$f1\n";

Если вы хотите определить все имена по умолчанию вверху, используйте для этого другую переменную (в любом случае, вероятно, лучше читать код):

#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;

my $default_f1 = "f1.log";
my $default_f2 = "f2.log";
my $default_f3 = "f3.log";

GetOptions(
    'a=s'    => \my $f1,
    'b=s'    => \my $f2,
    'c=s'    => \my $f3,
);

if (defined $f1) {
    $f1 .= ".log";
} else {
    $f1 = $default_f1;
}

print "$f1\n";
1 голос
/ 07 сентября 2010
$f1 = "$f1.log" unless $f1 =~ m/\.log$/i;

Добавляет расширение log , если у имени файла его еще нет. Поскольку значение по умолчанию заканчивается на log , ничего не происходит. И это работает, если пользователь вводит log в командной строке.

1 голос
/ 07 сентября 2010
if (defined $f1) {
  # You got a -a option
}

Но лично я предпочел бы прочитать опции в хеш и затем использовать exist ().

0 голосов
/ 07 сентября 2010

Один из способов добиться этого - использовать Moose и MooseX :: Getopt :

package MyApp;

use strict;
use warnings;

use Moose;
with 'MooseX::Getopt';

has f1 => (
    is => 'ro', isa => 'Str',
    cmd_aliases => 'a',
    default => 'f1.log',
    predicate => 'has_a',
);
has f2 => (
    is => 'ro', isa => 'Str',
    cmd_aliases => 'b',
    default => 'f2.log',
    predicate => 'has_b',
);
has f3 => (
    is => 'ro', isa => 'Str',
    cmd_aliases => 'c',
    default => 'f3.log',
    predicate => 'has_c',
);

# this is run immediately after construction
sub BUILD
{
    my $this = shift;

    print "a was provided\n" if $this->has_a;
    print "b was provided\n" if $this->has_b;
    print "c was provided\n" if $this->has_c;
}

1;
...