Thread getopts: Fehlermeldung nicht initialisierte Variablen, usage einrichten (7 answers)
Opened by la_dy82 at 2010-12-08 12:14

topeg
 2010-12-08 13:16
#143395 #143395
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich schaue in meine Glaskugel und sehe das du CPAN:Getopt::Std zum Parsen der Kommandozeile benutzt.
Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Std;
use Data::Dumper;

my %opts;
getopts('hif:', \%opts) || usage();
usage() if(exists($opts{h}));

print Dumper(\%opts);

sub usage
{
  print "USAGE: $0 -h -i -f <file>\n";
  exit;
}


Variablen sind undefiniert wenn ihnen keine werte zugewiesen wurden.
"defined" dient zum testen, ob eine Variable einen Wert enthält.

Getopt::Std kann Optionen, die keine Werte erwarten, auch keine Zuweisen, sie sind also "undef". Um heraus zu finden ob solch eine boolsche Option gesetzt wurde, musst du mit "exists" im Hash schauen ob der Eintrag gesetzt wurde. Siehe Beispiel.

Korrektur:
Getopt::Std setzt boolsche Optionen auf "1"
man kann also auch schreiben:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Std;
use Data::Dumper;

my %opts;
getopts('hif:', \%opts) || usage();
usage() if($opts{h}); # <== ohne exists

print Dumper(\%opts);

sub usage
{
  print "USAGE: $0 -h -i -f <file>\n";
  exit;
}


Ich vermute mal die "undef" werte kommen von einer Zuweiseung wie:
Code (perl): (dl )
my $file=$opts{f}

Da ist "$file" undef wenn wenn die option "-f" nicht genutzt wurde. "Dumper" zeigt das einen Schlüssel "f" nicht im Hash ist.
Last edited: 2010-12-08 13:27:29 +0100 (CET)

View full thread getopts: Fehlermeldung nicht initialisierte Variablen, usage einrichten