ich habe eine Frage zu Perl und komplizerten Datenstrukturen:
my %shortDays = ( "de" => ["so","mo","di","mi","do","fr","sa"],
"en" => ["su","mo","tu","we","th","fr","sa"],
"fr" => ["di","lu","ma","me","je","ve","sa"]);
my %shortDaysX = ("de" => ("so","mo","di","mi","do","fr","sa"),
"en" => ("su","mo","tu","we","th","fr","sa"),
"fr" => ("di","lu","ma","me","je","ve","sa"));
use Data::Dumper;
print Dumper(%shortDays);
print Dumper(%shortDaysX);
Warum ist im ersten Fall wie erwartet ein Hash mit Arrayreferenzen entstanden, aber im zweiten Fall kein Hash mit Arrays -genau genommen nur Müll?
$VAR1 = {
'en' => [
'su',
'mo',
'tu',
'we',
'th',
'fr',
'sa'
],
'fr' => [
'di',
'lu',
'ma',
'me',
'je',
've',
'sa'
],
'de' => [
'so',
'mo',
'di',
'mi',
'do',
'fr',
'sa'
]
};
$VAR1 = {
'me' => 'je',
'we' => 'th',
'en' => 'su',
'fr' => 'di',
'de' => 'so',
'mo' => 'tu',
'lu' => 'ma',
've' => 'sa',
'mi' => 'do'
};
Ein ähnliches Problem bei der Erstellung meines GDS Moduls.
Hast Du mal Google nach "perl hashes of arrays" befragt, damit bin ich damals weitergekommen und hab das Prinzip auch irgendwann verstanden (glaub ich zumindest).
Ja, habe Google natürlich befragt.
Aber viele Artikel zu Hash in Hashs oder Arrays in Hashs bzw. ArrayRefs in Hash gibt es nicht.
An den Stellen wo es interessant wird, höhren die Dokus leider auf.
Das GDS Modul nutzt nur einfache Hashs.
my %shortDays = ( "de" => ["so","mo","di","mi","do","fr","sa"],
"en" => ["su","mo","tu","we","th","fr","sa"],
"fr" => ["di","lu","ma","me","je","ve","sa"]);
funktioniert soweit - aber warum funktioniert das folgende irgendwie nicht:
my %shortDaysX = ("de" => ("so","mo","di","mi","do","fr","sa"),
"en" => ("su","mo","tu","we","th","fr","sa"),
"fr" => ("di","lu","ma","me","je","ve","sa"));
sieh output weiter oben.
Was man dazu wissen muss:
(..) erzeugt ein Array.
[..] erzeugt eine Referenz eines Arrays.
=> ist nur ein Synonym für ','
Ein Hash ist quasi intern ein Array, bei dem sich Keys und Werte abwechseln.
Wenn man ein Array A in ein Array B einfügt, dann werden die Werte des eingefügten Arrays A in das Array B eingefügt, das Array A existiert in B dann nicht mehr als eigenständige Struktur.
was habe ich denn hiermit definiert?
my %shortDaysX = ("de" => ("so","mo","di","mi","do","fr","sa"),
"en" => ("su","mo","tu","we","th","fr","sa"),
"fr" => ("di","lu","ma","me","je","ve","sa"));
Ist das überhaupt sinnvoll.
Ich hatte heute morgen eine weitere Variante probiert - ein Hash mit Referenzen auf Hashs:
my %contactsx= ( "CUL_FHTTK" => [ "Reading" => "Window", "Status" => "Open" ],
"HM" => [ "Reading" => "Window", "Status" => "Open" ],
"MAX" => [ "Reading" => "Window", "Status" => "Open" ]);
Leider kam da nur quatsch heraus:
$VAR1 = {
'CUL_FHTTK' => [
'Reading',
'Window',
'Status',
'Open'
],
'MAX' => [
'Reading',
'Window',
'Status',
'Open'
],
'HM' => [
'Reading',
'Window',
'Status',
'Open'
]
Für mich ist ein Hash auf eine ArrayReferenz herausgekommen - warum?
hab noch mal gegoogelt:
my %hash = (); # hash
my $hash_ref = {}; # Referenz auf ein hash
my @array = (); # Array
my $arra_ref = []; # Referenz auf ein Array
so richtig? Dann ist eine Unterscheidung zwischen Array und Hash nicht möglich, und meine Ergebnisse alle erklärt.
Zitat von: Dietmar63 am 27 Oktober 2013, 12:20:08Das GDS Modul nutzt nur einfache Hashs.
ja, weil verschachtelte Arrays dann letztendlich doch vermeidbar waren.
Zitat von: ntruchsess am 27 Oktober 2013, 18:15:28Was man dazu wissen muss: ...
Ergänzung:
perldoc perldsc(Perl Data Structures Cookbook)
<F>
Zur Frage ob folgendes sinnvoll ist und warum es (k)ein Müll ist.
my %shortDaysX = ("de" => ("so","mo","di","mi","do","fr","sa"),
"en" => ("su","mo","tu","we","th","fr","sa"),
"fr" => ("di","lu","ma","me","je","ve","sa"));
Wenn man => durch , ersetzt und die () weglässt, steht da:
my %shortDaysX = ("de","so","mo","di","mi","do","fr","sa",
"en","su","mo","tu","we","th","fr","sa",
"fr","di","lu","ma","me","je","ve","sa");
Kann man auch wieder zur bessern Lesbarkeit mit => schreiben
my %shortDaysX = (
"de" => "so",
"mo" => "di",
"mi" => "do",
"fr" => "sa",
"en" => "su",
"mo" => "tu",
"we" => "th",
"fr" => "sa",
"fr" => "di",
"lu" => "ma",
"me" => "je",
"ve" => "sa");
Und "es kann nur einen geben", d.h. bei doppelten hash Werten gewinnt der letzte. Also
my %shortDaysX = (
"de" => "so",
"mi" => "do",
"en" => "su",
"mo" => "tu",
"we" => "th",
"fr" => "di",
"lu" => "ma",
"me" => "je",
"ve" => "sa");
Aus Anwender Sicht mag das Müll sein, aber Perl sieht das bestimmt nicht so ;D