Undefinierte Hash-Referenz

11/12/2009 - 15:54 von K. Wittrock | Report spam
Hallo NG,

ich habe mal gedacht, ich hàtte die Basisfeatures von Perl kapiert. Mein
Problem:

use strict;
use warnings;
my $opts; # ref. to options hash
{
$opts = get_opts(); # get command line options
}
sub get_opts {
use Getopt::Long;
my %opts = ();
my $opts_ok = GetOptions(
\%opts,
'outformat=s', # desired output format
);
$opts_ok or [...];
print "exists +", exists $opts{outformat}, "+";
return \%opts;
}

Funktioniert prima. Allerdings hatte ich bei drag&drop nicht aufgepasst,
wodurch das print ursprünglich so aussah:

print "exists +", exists $opts->{outformat}, "+";

Ich weiß, den Fehler hàtte ich schnell bemerkt, wenn ich nicht denselben
Namen für 2 Dinge verwendet hàtte. Davon mal abgesehen: Nach meinem
Verstàndnis ist wàhrend der Ausführung des falschen print dem (de facto
globalen) Skalar $opts noch kein Wert zugewiesen. Wieso kommt dann kein
Laufzeitfehler?

Gruß

Klaus

Persönliche Antwort bitte nur an
K<ohne_Punkt_und_Komma>Wittrock<Klammeraffe>web.de
 

Lesen sie die antworten

#1 Frank Seitz
11/12/2009 - 16:32 | Warnen spam
K. Wittrock wrote:
Hallo NG,

ich habe mal gedacht, ich hàtte die Basisfeatures von Perl kapiert. Mein
Problem:

use strict;
use warnings;
my $opts; # ref. to options hash
{
$opts = get_opts(); # get command line options
}
sub get_opts {
use Getopt::Long;
my %opts = ();
my $opts_ok = GetOptions(
\%opts,
'outformat=s', # desired output format
);
$opts_ok or [...];
print "exists +", exists $opts{outformat}, "+";
return \%opts;
}

Funktioniert prima. Allerdings hatte ich bei drag&drop nicht aufgepasst,
wodurch das print ursprünglich so aussah:

print "exists +", exists $opts->{outformat}, "+";

Ich weiß, den Fehler hàtte ich schnell bemerkt, wenn ich nicht denselben
Namen für 2 Dinge verwendet hàtte. Davon mal abgesehen: Nach meinem
Verstàndnis ist wàhrend der Ausführung des falschen print dem (de facto
globalen) Skalar $opts noch kein Wert zugewiesen. Wieso kommt dann kein
Laufzeitfehler?



Stichwort: Autovivification. Ein undefinierter Skalar wird zu einer
Referenz, wenn du ihn als Referenz benutzt.

Grüße
Frank
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Homepage: http://www.frank-seitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2

Ähnliche fragen