Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Perl-Frage: Loop über Array, multi-dimensionales

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] - √ - Perl-Frage: Loop über Array, multi-dimensionales

    Hallo an die Perl-Experten,

    evtl kann mir ja jemand von weiterhelfen. Ich suche eine generische/elegante Art+Weise wie ich über ein Array beliebiger Länge iterieren und die Werte oder-Verknüpfen (bzw. addieren) kann. Beispiel: $input zeigt auf ein Array und jedes Element enthält einen der Werte "0" oder "1". Bisher nutze ich ein solches Konstrukt mit bei einer bekannten Anzahl von Elementen im Array:
    Code:
    return ($input->[0] || $input->[1] || $input->[2] || $input->[3] || $input->[4]); // returns 0 or 1
    Ich würde dies gern durch etwas wie dies erstzen:
    return (sum($input) > 0 ? 1 : 0);
    Geht das? Oder muss ich tatsächlich eine for-schleife bauen und selbst summieren bzw "ver-oder-n"?

    Danke!
    Micha

    #2
    Nun, wenn ich die Frage richtig verstehe ist eine for-Schleife übers Array dein bester Freund:
    Code:
    # oder
    my $result = 0 ;
    foreach my $invalue (@input) {
      if ($invalue > 0) {$result = 1;} 
    ..
    }
    (oder so ähnlich)

    Makki
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    Kommentar


      #3
      Danke makki,

      so in der Art passt das schon. Ich hatte nur gehofft dass es das auch als Einzeiler gibt. Und basierend auf deinem Vorschlag hab ich noch weiter gesucht und etwas gefunden: summe aller arrayelemente (Allgemeines zu Perl) - Perl-Community.de
      Code:
      use List::Util qw(sum);
      $sum = sum ( @$input )
      Das ist schön kompakt und funktioniert sehr gut :-)

      Danke,
      Micha
      PS@Mods: den Titel des Threads habe ich irgendwie versemmelt: alles ab dem Komma könnte eigentlich gelöscht werden

      Kommentar


        #4
        Zitat von mivola Beitrag anzeigen
        Code:
        use List::Util qw(sum);
        $sum = sum ( @$input )
        Das ist schön kompakt und funktioniert sehr gut :-)
        Warum "@$input"? Input als Array wäre doch nur "@input".
        Ansonsten verwende ich sum(@array) auch ganz gerne in meinen Plugins. i.d.R. aber nicht als Einzeiler, da somit noch eine debug Ausgabe folgen kann. So oder so ähnlich:
        Code:
        (sum(@array) > 0) ? ($retval = 1) : ($retval = 0);
        plugin_log($plugname, "[function ABC] retval: $retval") if ($debug >= 2);
        return $retval;

        Kommentar


          #5
          Zitat von XueSheng Beitrag anzeigen
          Warum "@$input"? Input als Array wäre doch nur "@input".
          Naja, so ganz genau kann ich es auch nicht erklären. Ich nutze dieses Konstrukt in Frys Logikprozessor. Und dort ist $input ein Skalar (oder eine Referenz/Zeiger auf das Array?). Um dann wieder an das Array zu kommen muss man "Dereferencing" betreiben: Dereferencing in perl

          Das mit der Log-Ausgabe ist klar. Das mache ich aber nur während ich an einem Plugin schraube. Wenn es funktioniert, wird das wieder eingestampft...

          VG
          Micha

          Kommentar


            #6
            Ist ne Philosophie-Frage, ich mag code lieber, den ich selber 1J später auch noch verstehe
            ohne "use irgendwas::hastenichgesehen"
            Aber es gibt viele Wege nach Rom..

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar

            Lädt...
            X