Announcement

Collapse
No announcement yet.

Strings rausfiltern und ersetzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Siehe Beitrag 9

    Unterscheide zwischen matchen und finden.

    Denke, du programmierst sonst JAVA. Ggf. teste das mit den Pattern und Matcherklassen

    Beispiele für den Ausdruck habe ich dir zur genüge gegeben auch ein Link wo du das testen kannst
    Christian

    Comment


    • #17
      Originally posted by Christian Marquardt View Post
      /HMS/ -> Deine Zeile besteht ja wohl aus noch mehr Zeichen

      /HMS.*/
      /HMS/ matcht auf HMS, HMSa, HMSxxxxx, aaaHMS. /HMS/ überprüft nur, ob "HMS" irgendwo im String vorkommt. Dein .* ist also unnötig.

      Wenn HMS am Anfang stehen soll, dann sollte man /^HMS/ schreiben. Das ^ sagt aus, dass HMS am Zeilenanfang stehen muss.
      Perl-Magazin
      Perl-Nachrichten

      Comment


      • #18
        Originally posted by aircraft_no5 View Post
        foreach $i(0..$#myscript)
        {
        if (@myscript=~m/HMS/)
        {
        print "HMS matched\n";
        }

        if (@myscript=~m/VKKLS/)
        {
        print "VKKLS matched\n"
        }


        ich versteh das nicht... ich lade meinen text in das array, und durchlaufe eine schleife für jede zeile, oder? aber irgendwie findet er keine treffer... sieht jemand hier einen fehler??
        Ja ;-) Du machst "@array =~ m/REGEX/". Das =~ sorgt dafür, dass das Array im Skalaren Kontext verwendet wird. Im Skalaren Kontext liefert ein Array die Anzahl der Elemente.

        Dein Ausdruck würde also dem hier entsprechen:

        my @array = (0,1);
        my $var = @array; # in $var steht jetzt 2
        $var =~ /REGEX/;

        Und REGEX ist *nicht* in 2 enthalten...

        Du musst also den Regulären Ausdruck auf ein *Element* des Arrays anwenden...
        Perl-Magazin
        Perl-Nachrichten

        Comment


        • #19
          Originally posted by aircraft_no5 View Post
          habe nun folgendes ausprobiert:

          open(PLTFILE, "$_[0]") or die "No such file\n";
          @myscript=<PLTFILE>;
          close(PLTFILE);
          Diese Form von "open" hat so seine Probleme. Siehe http://reneeb-perlblog.blogspot.com/...s-zu-open.html

          Originally posted by aircraft_no5 View Post
          foreach $i(0..$#myscript)
          {
          if (@myscript=~m/blablabla.*/)
          {
          print "blabla matched\n";
          }
          else {
          print "blalbla unmatched\n";
          }

          er öffnet die file und gibt für jede zeile unmatched aus, obwohl einige matches drin sein müssen!!
          Das würde man eher so schreiben:

          Code:
          for my $line ( @myscript ) {
              if( $line =~ m/blablabla.*/ ) {
                  print "matched";
              }
          }
          Perl-Magazin
          Perl-Nachrichten

          Comment


          • #20
            Originally posted by Christian Marquardt View Post
            Siehe Beitrag 9

            Unterscheide zwischen matchen und finden.

            Denke, du programmierst sonst JAVA. Ggf. teste das mit den Pattern und Matcherklassen

            Beispiele für den Ausdruck habe ich dir zur genüge gegeben auch ein Link wo du das testen kannst
            klar programmier ich java, aber hatte eben noch nie kontakt mit regular expressions... dafür mach ich viel richtung gui-programmierung...

            ps: wenn dich meine fragerei nervt, dann fühl dich frei, nicht mehr zu posten... ich erklär auch tausend mal gui-grundlagen in anderen foren... alle fangen bei jedem thema klein an... schade, dass wir nicht alle als perl-cracks wie du zur welt kommen...

            Comment


            • #21
              Originally posted by reneeb View Post
              Diese Form von "open" hat so seine Probleme. Siehe http://reneeb-perlblog.blogspot.com/...s-zu-open.html



              Das würde man eher so schreiben:

              Code:
              for my $line ( @myscript ) {
                  if( $line =~ m/blablabla.*/ ) {
                      print "matched";
                  }
              }
              danke reneeb...

              Comment


              • #22
                ich erklär auch tausend mal gui-grundlagen in anderen foren...
                Sehe dich nicht bei Swing....

                alle fangen bei jedem thema klein an...
                Sicherlich, aber wenn du dich nicht selbst um die Syntax der Ausdrücke bemühst, wer sollte es sonst tun?

                Und "geht nicht" ist noch nie ein Fehler gewesen.


                schade, dass wir nicht alle als perl-cracks wie du zur welt kommen...
                Die Syntax der regl. Ausdrücke ist in fast allen Sprachen gleich.
                Christian

                Comment


                • #23
                  Originally posted by aircraft_no5 View Post
                  inhalt der cfg (den ich in ein array lade):

                  brezel_
                  schnitzel_
                  cola_
                  Kann es vielleicht sein, dass in dem Array die Element noch den Zeilentrenner haben? Hast Du beim Einlesen der Datei ein "chomp" gemacht?

                  Wenn der Zeilentrenner noch drin ist, dann prüfst Du, ob "wiener_schnitzel_43" "schnitzel_<zeilenumbruch>" enthält. Und das trifft ja nicht zu.

                  Zum chomp: chomp entfernt den Zeilentrenner (genauer: das was in $/ steckt, spielt hier aber keine Rolle).

                  So liest man eine Datei üblicherweise ein:
                  Code:
                  # öffne Datei zum lesen
                  open my $fh, '<', $file or die $!;
                  
                  while( my $line = <$fh> ) {
                      chomp $line;
                      #  mach was mit $line
                  }
                  Wenn Du alles in ein Array lesen willst, dann kannst DU es auch so machen:
                  Code:
                  open my $fh, '<', $file or die $!;
                  my @lines = <$fh>;
                  close $fh;
                  
                  chomp @lines;
                  Perl-Magazin
                  Perl-Nachrichten

                  Comment


                  • #24
                    Originally posted by reneeb View Post
                    Kann es vielleicht sein, dass in dem Array die Element noch den Zeilentrenner haben? Hast Du beim Einlesen der Datei ein "chomp" gemacht?

                    Wenn der Zeilentrenner noch drin ist, dann prüfst Du, ob "wiener_schnitzel_43" "schnitzel_<zeilenumbruch>" enthält. Und das trifft ja nicht zu.

                    Zum chomp: chomp entfernt den Zeilentrenner (genauer: das was in $/ steckt, spielt hier aber keine Rolle).

                    So liest man eine Datei üblicherweise ein:
                    Code:
                    # öffne Datei zum lesen
                    open my $fh, '<', $file or die $!;
                    
                    while( my $line = <$fh> ) {
                        chomp $line;
                        #  mach was mit $line
                    }
                    Wenn Du alles in ein Array lesen willst, dann kannst DU es auch so machen:
                    Code:
                    open my $fh, '<', $file or die $!;
                    my @lines = <$fh>;
                    close $fh;
                    
                    chomp @lines;
                    hi, danke für die antwort...

                    schnitzel_ hab ich aus einer anderen datei ausgeschnitten, die sah folgendermaßen aus:

                    344_AHH_Schnitzel_JJ90

                    Alles rund um schnitzel_ abgeschnitten; meinst, dass der zeilenumbruch immer noch da ist??

                    Comment


                    • #25
                      Originally posted by Christian Marquardt View Post
                      Die Syntax der regl. Ausdrücke ist in fast allen Sprachen gleich.
                      das mag sein, aber ich hab noch nie was mit regular expressions zu tun gehabt, und nun muss ich in kürzester zeit von 0 auf 100...

                      Comment


                      • #26
                        das mag sein, aber ich hab noch nie was mit regular expressions zu tun gehabt, und nun muss ich in kürzester zeit von 0 auf 100...
                        Was hat dich gehindert, die von mir geposteten Links zu besuchen und dort etwas über das Suchen und Ersetzen in Perl zu lernen?

                        Was hat dich gehindert, den Link mit der RegEx-Online zu nutzen und selbst den Ausdruck zu entwickeln?

                        Was hindert dich Fragen mal richtig zu stellen?
                        Alles rund um schnitzel_ abgeschnitten; meinst, dass der zeilenumbruch immer noch da ist??
                        Bin ja gespannt was renneb antwortet, aber ich würde sagen:

                        Solange man nicht weiss wie du was "rausschneidest" kann man seriös nicht sagen, ob der Umbruch noch drin ist.

                        http://www.tty1.net/smart-questions_de.html
                        Christian

                        Comment


                        • #27
                          sub CleanCFG() {
                          open(CFG_PLT, $CFG_PLT);
                          @CFG_PLT=<CFG_PLT>;
                          close (CFG_PLT);

                          foreach(@CFG_PLT) {
                          $pos_ = rindex($_,"_");
                          if ($pos_ != -1)
                          {
                          $_Counter++;
                          @CFG_PLT_CLEAN[$_Counter] = substr($_,0,$pos_+1)."\n";
                          }
                          }
                          }


                          das ist die methode um das schnitzel_ auszuschneiden...

                          Comment


                          • #28
                            Ich kannes nicht anders sagen:

                            Es müsste dich anspringen....so deutlich steht es da
                            @CFG_PLT_CLEAN[$_Counter] = substr($_,0,$pos_+1)."\n";
                            Christian

                            Comment


                            • #29
                              Originally posted by Christian Marquardt View Post
                              Ich kannes nicht anders sagen:

                              Es müsste dich anspringen....so deutlich steht es da
                              @CFG_PLT_CLEAN[$_Counter] = substr($_,0,$pos_+1)."\n";
                              ohhh mist, jetzt seh ich es auch... und auch noch so überdeutlich...

                              viiiielen dank...

                              Comment


                              • #30
                                Originally posted by Christian Marquardt View Post
                                Bin ja gespannt was renneb antwortet, aber ich würde sagen:

                                Solange man nicht weiss wie du was "rausschneidest" kann man seriös nicht sagen, ob der Umbruch noch drin ist.
                                Richtig, das hätte ich gefragt ;-)

                                Originally posted by aircraft_no5 View Post
                                sub CleanCFG() {
                                open(CFG_PLT, $CFG_PLT);
                                @CFG_PLT=<CFG_PLT>;
                                close (CFG_PLT);

                                foreach(@CFG_PLT) {
                                $pos_ = rindex($_,"_");
                                if ($pos_ != -1)
                                {
                                $_Counter++;
                                @CFG_PLT_CLEAN[$_Counter] = substr($_,0,$pos_+1)."\n";
                                }
                                }
                                }
                                Nur mal als Hinweise, was man hier besser machen kann:
                                Code:
                                sub CleanCFG {
                                    my @CFG_PLT;
                                
                                    if( open my $CFG_PLT, '<', $CFG_PLT) ) {
                                        @CFG_PLT=<$CFG_PLT>;
                                        close ($CFG_PLT);
                                    }
                                
                                    foreach(@CFG_PLT) {
                                        $pos_ = rindex($_,"_");
                                        if ($pos_ != -1) {
                                            push @CFG_PLT_CLEAN, substr($_,0,$pos_+1);
                                        }
                                    }
                                }
                                Was bedeuten diese Änderungen:

                                Als erstes habe ich die "()" nach "sub CleanCFG" rausgenommen. Damit sagst Du, dass die Subroutine eine leere Prototyp-Liste hat. Im Gegensatz zu anderen Sprachen werden die Klammern in Perl nur in absoluten Ausnahmefällen benutzt, da Prototypen in 99% der Fälle *nicht* das machen, was der Programmierer machen wollte. Die Prototypen in Perl muss man verstehen und das ist ziemlich komplex.

                                Zweitens habe ich das Einlesen der Datei in einen if-Block gepackt. Damit vermeide ich Fehler und Warnungen falls es die Datei nicht gibt oder andere Fehler auftreten. Weiterhin verwende ich lexikalische Dateihandles und das 3-arg-open. Warum, ist in dem Blogpost beschrieben, den ich weiter oben verlinkt habe.

                                Ich möchte Dich nur für die Zukunft darauf hinweisen, dass die von Dir verwendete Form Probleme machen *kann*. Kannst Dich ja bei Gelegenheit mal damit beschäftigen.

                                Und dann würde ich push verwenden, statt einen Zähler mitzuführen, nur damit ich die Elemente an die "richtige" Stelle speichere.

                                push fügt ein Element an das Ende eines Arrays an.
                                Perl-Magazin
                                Perl-Nachrichten

                                Comment

                                Working...
                                X