[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