FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Dietmar63 am 27 Oktober 2013, 11:22:17

Titel: Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: Dietmar63 am 27 Oktober 2013, 11:22:17
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'
        };
Titel: Antw:Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: betateilchen am 27 Oktober 2013, 11:46:13
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).
Titel: Antw:Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: Dietmar63 am 27 Oktober 2013, 12:20:08
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.

Titel: Antw:Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: ntruchsess am 27 Oktober 2013, 18:15:28
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.
Titel: Antw:Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: Dietmar63 am 27 Oktober 2013, 19:18:58
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?
Titel: Antw:Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: Dietmar63 am 27 Oktober 2013, 19:25:09
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.

 
Titel: Antw:Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: betateilchen am 27 Oktober 2013, 19:42:16
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.
Titel: Antw:Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: fritz am 03 Januar 2014, 13:06:27
Zitat von: ntruchsess am 27 Oktober 2013, 18:15:28Was man dazu wissen muss: ...
Ergänzung: perldoc perldsc
(Perl Data Structures Cookbook)

<F>
Titel: Antw:Perl und komplizierte Datenstrukturen Hash mit Arrayreferenzen?, Hash mit Array?
Beitrag von: bolo am 09 Januar 2014, 21:00:13
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