Sergej: Ermitteln ob ein Array-Element existiert, wenn nicht anhängen...

Hallo,

Ermitteln ob ein Hash-Namen existiert gibt es ja (exist),
aber wie kriege ich raus ob ein bestimmtes Element(Zeichenkette) in einem Array vorhanden ist?
mit 'grep' sieht es komisch.

if (grep($element, @array) != 0)
{
   @vorhanden =  unshift(@vorhanden,$element);

oder

@vorhanden =  push(@vorhanden,$element);
}

Bitte um Vorschläge.
Danke.

Gruß Sergej

  1. Halihallo Sergej

    Ermitteln ob ein Hash-Namen existiert gibt es ja (exist),
    aber wie kriege ich raus ob ein bestimmtes Element(Zeichenkette) in einem Array vorhanden ist?
    mit 'grep' sieht es komisch.
    if (grep($element, @array) != 0)

    perldoc -f grep

    Evaluates the BLOCK or EXPR for each element of LIST (locally
                setting "$_" to each element) and returns the list value
                consisting of those elements for which the expression evaluated
                to true. In scalar context, returns the number of times the
                expression was true.

    Naja, in deinem Fall vielleicht nicht ganz sinnvoll, jedoch funktional.

    {
       @vorhanden =  unshift(@vorhanden,$element);

    oder

    @vorhanden =  push(@vorhanden,$element);
    }

    perldoc -f push
    perldoc -f unshift

    ACHTUNG: Diese Funktionen geben die die neue _Anzahl_ Elemente des Arrays zurück!

    if (grep($element,@array) > 0) {
       push( @vorhanden, $element );
    }

    Hast du eigentlich das andere Problem von weiter unten lösen können? - Das @Msg-Ding da.

    Viele Grüsse

    Philipp

    1. Halihallo Sergej

      ?? - Der Titel sagt aber was ganz anderes!

      my $anfuegen = 1;
      foreach (@array) {
         if ($_ eq $element) {
            $anfuegen = undef;
         }
      }
      if ($anfuegen) {
         push @array, $element;
      }

      Viele Grüsse

      Philipp

      1. Hallo Phil and @ll,

        Die Schleife bleibt bei der Ausgabe hängen, scheint als wäre sie in einer Endlosschleife. Wieso?

        for (my $i=0; $i <=$z_nr; $i++ ) {
             for (my $j=$i+1; $j <=$z_nr; $j++ ){
             if (($Msg[$i] eq $Msg[$j]) and (abs(($MsgTime[$i] - $MsgTime[$j]) > TimeAbstd))) {
               foreach (@vorhanden) {
               if ($_ eq $Msg[$j]) {
                  $anfuegen = undef;
               }
            }
            if ($anfuegen) {
               push (@vorhanden, $Msg[$j]);
               print FHout $zeile[$i];
               print FHout $zeile[$j]."\n";
               print "\n $i -- $j \n";
            }
                      }
              }
                }

        Gruß Sergej

        1. Halihallo Sergej

          Die Schleife bleibt bei der Ausgabe hängen, scheint als wäre sie in einer Endlosschleife. Wieso?

          Ich sehe keinen Grund dazu. Wieviele Elemente lässt du denn verarbeiten? - Das Programm
          ist nicht wirklich performant, könnte gut sein, dass es einfach sehr lange dauert.
          Versuche einige prints einzusetzen, ala print "jetzt: $i/$j\n"
          Versuche auch, eine angenehme Struktur zu erarbeiten. Also bei jedem { eine Zeile dazu
          und um vier Zeichen einrücken, bei jedem } auch eine neue Zeile, aber wieder vier zurück.
          So kannst du sehen, ob du irgendwo eine Klammer falsch gesetzt hast.

          TimeAbstd sei eine Konstante? - Hat zwar nix mit Endlosschleife zu tun, aber Konstanten
          werden GROSS geschrieben und wie definierst du sie?

          Viele Grüsse

          Philipp

          1. Hallo Phil,

            TimeAbstd sei eine Konstante? - Hat zwar nix mit Endlosschleife zu >>tun, aber Konstanten
            werden GROSS geschrieben und wie definierst du sie?

            use constant TimeAbstd  => 5;
            __________________________________________________________
            Bildschirmausgabe:

            13843
            13844
            13845
            13846
            13847   <<==die letzte eingelesene Zeile in einem Array @zeile

            2 -- 1231 <<== Ausgabe $i -- $j
             17 -- 1434 <<== Ausgabe $i -- $j
            !!! Ab hier bleibt er stehen
            __________________________________________________________

            An der Größe kanns nicht liegen.
            Im Ausgabefile sind 0 Byte, hatte schon mal 150 MB ;-)

            ich denke hier ist was Falsch:

            if ($anfuegen) {
              push (@vorhanden, $Msg[$j]);
              print FHout $zeile[$i];
              print FHout $zeile[$j]."\n";
              print "\n $i -- $j \n";
              }
            Danke.
            Gruß Sergej

            1. Hallo Phil,

              du hattest recht!!
              $anfuegen = 1; genau das hat gefehlt.
              Das muß man ja jedes mal auf 1 setzen sonst undef...

              Tolle Zusammenarbeit!

              Danke Gruß Sergej

              1. Halihallo Sergej

                Uh, wollte schon auf das andere antworten...

                du hattest recht!!
                $anfuegen = 1; genau das hat gefehlt.
                Das muß man ja jedes mal auf 1 setzen sonst undef...

                Das wars?? - Na gut... ;)

                Tolle Zusammenarbeit!

                Freut mich helfen zu können.

                Viele Grüsse

                Philipp

                PS: Konstanten werden GROSS geschrieben, genau wie Filehandles! :-)

        2. Halihallo Sergej

          for (my $i=0; $i <=$z_nr; $i++ ) {
             for (my $j=$i+1; $j <=$z_nr; $j++ ){
                if (
                     ($Msg[$i] eq $Msg[$j]) and
                     (($MsgTime[$i] - $MsgTime[$j]) > TimeAbstd)
                   ) {
                   $anfuegen = 1;
                   foreach (@vorhanden) {
                      if ($_ eq $Msg[$j]) {
                         $anfuegen = undef;
                      }
                   }
                   if ($anfuegen) {
                      push (@vorhanden, $Msg[$j]);
                      print FHout $zeile[$i];
                      print FHout $zeile[$j]."\n";
                      print "\n $i -- $j \n";
                   }
                }
             }
          }

          hier eine etwas lesbarere Struktur... $anfuegen muss schon auf 1 gesetzt werden!

          Viele Grüsse

          Philipp

    2. Hallo Phil,

      Cool du bist auch hier, ich dachte alle sind auf Fashing.
      Das ist ein Teilproblem von gestern ;-)

      Mit dem couter kam ich nicht zurecht :-(

      Hier meine Superschleife mit Messages:
      Hier wird jede Message nur einmal mit jeder verglichen(wg. j=i+1)
      MsgTime ist nur eine sonderbedingung!
      TimeAbstd ist eine constante.

      for (my $i=0; $i <=$z_nr; $i++ ) {
           for (my $j=$i+1; $j <=$z_nr; $j++ ){
           if (($Msg[$i] eq $Msg[$j]) and (abs(($MsgTime[$i] - $MsgTime[$j]) > TimeAbstd))) {
            next if ($Msg[$i] element @vorhanden); # <= ????????? so was ähnliches
           @vorhanden =  unshift(@vorhanden,$Msg[$j]);
           print FHout $zeile[$i];
         print FHout $zeile[$j]."\n";
         print "\n $i -- $j \n";
                }
            }
              }

      Und du meinst ich solls mit
      if (grep($element,@array) > 0) {
         push( @vorhanden, $element );
      }
      probieren?

      Gruß Sergej

      1. Halihallo Sergej

        Cool du bist auch hier, ich dachte alle sind auf Fashing.

        Da ich nicht 'alle' bin, darf ich arbeiten :-)

        for (my $i=0; $i <=$z_nr; $i++ ) {
             for (my $j=$i+1; $j <=$z_nr; $j++ ){
             if (($Msg[$i] eq $Msg[$j]) and (abs(($MsgTime[$i] - $MsgTime[$j]) > TimeAbstd))) {
              next if ($Msg[$i] element @vorhanden); # <= ????????? so was ähnliches

        Das 'abs' brauchst du nicht.

        if (grep( $_ eq $Msg[$j], @array ) > 0) { next; }

        wäre richtig.

        Und du meinst ich solls mit
        if (grep($element,@array) > 0) {
           push( @vorhanden, $element );
        }

        s. oben. grep prüft die EXPR auf "Wahr". Wenn $element definiert ist und nicht gleich
        0 oder "", ist die Bedingung _immer_ wahr. Du musst schon mit $_ vergleichen, $_ ist
        das aktuelle Element von @array.

        Einfach sagen, was nicht funktioniert; hab mir alles nicht sehr genau angesehen.

        Viele Grüsse

        Philipp