2010-09-07 14 views
1

myscript.plComment vérifier quels drapeaux ont été lus en utilisant Getopt :: Long en Perl?

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 
} 
  • Tous les drapeaux sont facultatifs.

  • Si j'appelle le script comme

    perl myscript.pl -a=filename 
    

    je dois ajouter un .log au nom du fichier avant de l'ouvrir à Line a. Pour cela, j'ai besoin de savoir si GetOptions lire quelque chose dans $f1 ou non.

Comment cela peut-il être fait?

Répondre

2

La solution la plus simple consiste à rechercher /[.]log$/ dans $f1 et de l'ajouter si elle n'est pas présente. Malheureusement, cela signifie que lorsque l'utilisateur passe en "foo.log" et voulait que cela devienne "foo.log.log", il ne le sera pas, mais je pense que nous pouvons convenir que cet utilisateur est un abruti.

Une meilleure option, qui fera la secousse heureux, est:

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

Si vous voulez définir tous les noms par défaut en haut, utilisez une autre variable pour le faire (il est probablement une meilleure lecture Code de toute façon):

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

Yat-il aucun moyen de vérifier si le drapeau a été lu ou pas? – Lazer

+0

@Lazer Voir mon edit, il y a si vous ne le définissez pas à l'avance. –

+0

Ils pourraient toujours simplement passer 'foo.log.log' s'ils * voulaient vraiment ce nom de fichier. –

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

Mais personnellement, je préférerais read the options into a hash, puis j'utiliser exists().

+0

qui sera toujours vrai en raison de l'initialisation que j'ai à la ligne 2. – Lazer

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

Ajoute le journal l'extension si le nom de fichier ne possède pas déjà un. Puisque la valeur par défaut se termine par log, rien ne se passe. Et cela fonctionne si l'utilisateur tape le log sur la ligne de commande.

+0

Pouvez-vous expliquer comment se passe l'ajout en utilisant 'm/\. Log $/i'? – Lazer

+0

Qu'en est-il de l'utilisateur qui veut que le journal s'appelle 'foo.log.log'? –

+0

L'ajout se produit dans l'affectation: $ f1 = "$ f1.log". –

0

Une façon d'y parvenir est d'utiliser Moose et 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;