Wie Sie überprüfen, welche Flags gelesen wurden Getopt :: Long in Perl?
-
01-10-2019 - |
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 anLine a
öffnen. -
Für das Ich muss wissen, ob
GetOptions
etwas in$f1
lesen oder nicht.
Wie kann dies geschehen?
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;