Frage

  

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
}
  • Alle Flaggen sind optional.

  • Wenn ich rufe Sie das Skript als

    perl myscript.pl -a=filename
    

    Ich brauche einen .log an den Dateinamen anzuhängen, bevor es an Line a öffnen.

  • Für das Ich muss wissen, ob GetOptions etwas in $f1 lesen oder nicht.

Wie kann dies geschehen?

War es hilfreich?

Lösung

Die einfachste Lösung ist für /[.]log$/ in $f1 zu suchen und es hinzufügen, wenn es nicht vorhanden ist. Leider das bedeutet, dass, wenn übergibt der Benutzer in "foo.log" und wollte es "foo.log.log" wird es nicht, aber ich denke, wir, dass Benutzer ein Ruck einigen können.

Eine bessere Option, die den Ruck glücklich machen wird, ist:

#!/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";

Wenn Sie alle Standardnamen an der Spitze definieren mögen, eine andere Variable verwenden, das zu tun (es ist wahrscheinlich besser lesen Code sowieso):

#!/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";

Andere Tipps

if (defined $f1) {
  # You got a -a option
}

Aber ich persönlich würde lieber die Optionen in einem Hash lesen und dann existiert Verwendung ().

$f1 = "$f1.log" unless $f1 =~ m/\.log$/i;

Hängt die log Erweiterung, wenn der Dateiname nicht bereits eine haben. Da die Standardwert Enden in log , passiert nichts. Und es funktioniert, wenn der Benutzer die log auf der Kommandozeile.

Eine Möglichkeit, dies zu erreichen, ist zu verwenden Moose und 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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top