[vienna.pm] Verzweiflung mit hasharrays
Marcel Grunauer
marcel.gruenauer at chello.at
Sat Nov 3 07:44:48 CST 2001
* * * vienna-pm-list * * *
Hi Michael,
zunaechst mal: immer 'use strict' und 'use warnings' (-w vor Version
5.6).
Immer!
Immer!
> @emnrc { "opt\n",
> "name=foo",
> "value=bar" };
Ich nehme an, Du meinst
my @emnrc = (
"opt\n",
"name=foo",
"value=bar"
);
D.h. runde statt geschwungener Klammern, sodass Du eine Liste von drei
Elementen hast, nicht eine Liste von einem Element, das ein hashref
ist. Oder?
Was macht das $opt und $n eigentlich? Das geht doch sicher einfacher.
Vielleicht, wenn Du's erklaerst, was das ganze Codestueck tun soll,
kann man's vereinfachen.
> %bb=$menu[0];
Allenfalls ist in $menu[1] was drin, da Du ja $n erhoeht hast.
Und $menu[1] ist ein hashref, also musst Du es dereferenzieren:
my %bb = %{ $menu[1] };
Mit 'warnings' haettest Du hier eine Fehlermeldung bekommen.
> print $key $bb{$key};
Das hier verwendet $key als filehandle. Vielleicht meinst Du
print $key, $bb{$key};
oder
print $key . $bb{$key};
oder
print "$key $bb{$key}";
Siehe "perldoc -f print".
Ein einfaches Hilfsmittel, um herauszufinden, wie die von Dir
erzeugte Struktur aussieht, ist Data::Denter (oder Data::Dumper)
zu verwenden. Data::Dumper ist ein Standardmodul; Data::Denter
musst Du zwar erst installieren, ist aber bei weitem uebersichtlicher.
also
use Data::Denter;
print Denter \@menu;
am Ende.
Nach Einruecken, 'use strict', 'use warnings' und Entfernung
ueberfluessiger Interpunktion kommt raus:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Denter;
my $opt = 0;
my $n = 0;
my @menu;
my @emnrc = (
"opt\n",
"name=foo",
"value=bar"
);
while (my $d = shift @emnrc) {
$opt-- if $opt == 2;
if ($d eq "opt\n") {
$opt=2;
$n++
}
if ($opt==1) {
my ($name,$value) = split '=', $d;
$menu[$n]{$name} = $value;
}
}
print Denter \@menu;
my %bb = %{ $menu[1] };
foreach my $key (keys %bb) {
print $key.$bb{$key};
}
und gibt aus:
@
?
%
name => foo
value => bar
valuebarnamefoo
Die ersteren Zeilen stammen von Data::Denter. Das '?' heisst,
dass $menu[0] undefiniert ist. Siehe 'perldoc Data::Denter'.
Marcel
--
Aspect-Oriented Perl http://codewerk.unixbeard.net/aspects/
cpan> install Aspect
###
You are subscribed to vienna-pm-list as Marcel Grunauer <marcel.gruenauer at chello.at>
http://www.fff.at/fff/vienna.pm/
More information about the Vienna-pm
mailing list