1

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で開く前に、ファイル名にa を追加する必要がありますLine a

  • そのためには、GetOptions何かを読み込むかどうかを知る必要があり$f1ます。

これはどのように行うことができますか?

4

4 に答える 4

2

/[.]log$/最も簡単な解決策は、 inを探して、$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";
于 2010-09-07T11:54:08.947 に答える
1
if (defined $f1) {
  # You got a -a option
}

しかし、個人的には、オプションをハッシュに読み込んでから、 exists() を使用することを好みます。

于 2010-09-07T11:52:20.857 に答える
1
$f1 = "$f1.log" unless $f1 =~ m/\.log$/i;

ファイル名にログ拡張子がない場合は、ログ拡張子を追加します。デフォルト値はlogで終わるため、何も起こりません。また、ユーザーがコマンドラインでログを入力すると機能します。

于 2010-09-07T11:55:55.913 に答える
0

これを実現する 1 つの方法は、MooseMooseX::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;
于 2010-09-07T16:26:58.793 に答える