Perl: Reihenfole der Ausgabe von assoziativen Arrays

juedan

FreeBSDler
Hallo Forum,

gerade bin ich dabei meine Homepage auf "responsives Design" umzustellen. Die Seiten werden sowohl in Perl als auch in PHP generiert.
Nun habe ich bei den Perl-Skripten folgendes Problem: Die Ausgabe von assoziativen Arrays folgt nicht dem vorgegeben Array:eek:

Kode-Schnipsel:
Code:
[...]
sub Webpage_Header {
    my $arrAuswahlpunkte = shift;
  
    print "<!-- Header -->\n";
    print "<header id='header'>\n";
    print "<h1><a href='/index.html'>Titel</a></h1>\n";
    if ($arrAuswahlpunkte) {
        print "<nav id='nav'>\n";
        print "<ul>\n";
        while (my ($text, $link) = each(%{$arrAuswahlpunkte})) {
            print "<li><a href='", $link, "'>", $text, "</a></li>\n";
        }
        print "</ul>\n";
        print "</nav>\n";
    }
    print "</header>\n";
}
[...]
my %arrMenue = (
    "Home" => "/index.html",
    "Wetter" => "/Wetterdienste/index.html",
    "Wetterstation" => "/cgi-bin/wetterstation.pl?iaco=" . $iaco
);
[...]

[...]
    Webpage_Header(\%arrMenue);
[...]

Die Ausgabe:
Code:
<header id='header'>
<h1><a href='/index.html'>Jürgen Dankoweit</a></h1>
<nav id='nav'>
<ul>
<li><a href='/index.html'>Home</a></li>
<li><a href='/cgi-bin/wetterstation.pl?iaco=10980'>Wetterstation</a></li>
<li><a href='/Wetterdienste/index.html'>Wetter</a></li>
</ul>
</nav>
</header>

Die Reihenfolge der Auswahlpunkte stimmt nicht mit der Angabe im Array überein. Wie kann das sein?

Danke schon einmal für die Antworten.

Beste Grüße

Jürgen

PS: Dass ich meine Webpages sowohl in Perl als auch in PHP schreibe hat einen einfachen Grund: Den komplexen Daten-Parser habe ich in Perl geschrieben - war einfacher zu realisieren - und eine Portierung nach PHP ist viel zu aufwendig...
 
Warum genau muss das ein Hash und kein Array sein? Du nennst es doch sogar schon "arr...".
 
Die Reihenfolge der Auswahlpunkte stimmt nicht mit der Angabe im Array überein. Wie kann das sein?
Perl Hashes sind Key, Value Paare. Die Reihenfolge bleibt nicht erhalten. Wenn du die Reihenfolge beibehalten willst, nimm z.B. ein Array von Hashes:

my @arrMenue = ( { name => "Home", link => "/index.html" }, { name => "Wetter", link => "foo" }, ...);

Dann in der Funktion:

foreach my $ref (@{$arrAuswahlpunkte}) { print "<li><a href=\"$ref->{link}\">$ref->{name}</a></li>\n"; }
 
NAbend,

danke für die Antworten.

@shifty64: Danke für den Hinweis und Information. Damit ist alles klar und ich werden wohl die Anregung von @TCM aufgreifen und ein reines Array nutzen.

Schönen Abend noch

Jürgen
 
Zurück
Oben