Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?

Begonnen von Dietmar63, 27 Oktober 2013, 11:22:17

Vorheriges Thema - Nächstes Thema

Dietmar63

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'
        };
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

betateilchen

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).
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dietmar63

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.

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

ntruchsess

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.
while (!asleep()) {sheep++};

Dietmar63

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?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

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.

 
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fritz


bolo

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