andy: Perl - Textverarbeitung

Hallo,

wollte in Perl etwas ahnliches machen. Ich habe eine Liste von Wörtern mit Komma getrennt. (Bsp: heute, morgen, usw, ...)
Ich will diese liste auf einem Text laufen lassen. Wenn in diesem Text Würter wokommen die in Meine Liste sind dann will ich diese Wörtern markieren.
Ist das möglich mit Perl und wie könnte es ausschauen,

vielen Dank im vorraus,

gruss, andy

  1. Ich will diese liste auf einem Text laufen lassen. Wenn in diesem Text Würter wokommen die in Meine Liste sind dann will ich diese Wörtern markieren.
    Ist das möglich mit Perl und wie könnte es ausschauen,

    Das geht mit 3 Zeilen:

    my $text = <<TEXT;
    bla blubb
    und test und noch ein testb so.
    TEXT

    my @list = qw/test testb testc/;
    my $pattern = join '|', map quotemeta, @list;
    $text =~ s/($pattern)/<mark>$1</mark>/g;

    print $text ;

    Struppi.

  2. 你好 andy,

    wollte in Perl etwas ahnliches machen.

    “Etwas ahnliches machen”? Was meinst du?

    Ich will diese liste auf einem Text laufen lassen. Wenn in diesem Text
    Würter wokommen die in Meine Liste sind dann will ich diese Wörtern
    markieren.
    Ist das möglich mit Perl und wie könnte es ausschauen,

    Klar ist das moeglich. Du brauchst dafuer:

    split
      Schleifen
      Suchen & Ersetzen

    再见,
    CK

    --
    Kommt ein Vektor zur Drogenberatung: "Hilfe, ich bin linear abhaengig!"
    1. Hi,

      wollte in Perl etwas ahnliches machen.
      “Etwas ahnliches machen”? Was meinst du?

      Vorfahren erforschen? ;-)

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    2. Hallo,

      können Sie mir bisschen mehr helfen.
      ich habe so angefangen:

      open(FILE1, $ARGV[0])|| die "could not open file";

      wo die einträge gespeichert sind

      while(<FILE1>){
      chomp;
      @Felder=split(/,/,$_);
      }
      open(FILE2, $ARGV[1])|| die "could not open file";
      #file 2 ist die textdatei
      while (<FILE2>)

      was muss ich jetzt weiter machen?

      Bitte um hilfe

      danke

      1. open(FILE1, $ARGV[0])|| die "could not open file";

        wo die einträge gespeichert sind

        while(<FILE1>){
        chomp;
        @Felder=split(/,/,$_);
        }

        Felder enthält jetzt nur die Einträge aus der letzten Zeile. wenn di Datei nur ein Zeile enthält reicht durchaus:

        my chomp( @felder = split /,/, <FILE1>);

        open(FILE2, $ARGV[1])|| die "could not open file";
        #file 2 ist die textdatei
        while (<FILE2>)

        was muss ich jetzt weiter machen?

        Erstmal das Suchmuster erzeugen:
        my $pattern = join '|', map quotemeta, @felder;

        und dann je nach dem wie gross dei Datei ist, entweder auf jede Zeile anwenden oder die Datei einlesen und in einem Rutsch ersetzen:

        while (<FILE2>)
        {
        chomp;
        s/($pattern)/<mark>$1</mark>/g;
        push @file, $_;
        }

        Struppi.

        1. Hallo, Struppi,

          ich habe bis jetzt so gemacht aber es tut sich nichts!
          open(FILE1, $ARGV[0])|| die "could not open file";

          while(<FILE1>){
            chomp;
          @Felder=split(/,/,$_);
          }

          my $pattern = join '|', map quotemeta, @Felder;

          while (<FILE2>)
          {
          chomp;
          s/($pattern)/<mark>$1</mark>/g;
          push @file, $_;
          }

          file1.txt schaut so aus: montag, dienstag, mittwoch,...usw. Es ist nicht nur eine Zeile.
          file2.txt schaut so aus. Am montag wird schönes Wetter sein.... usw
          Ich will nun das nur Montag markiert wird. Aber der script macht das nicht. Woran liegt der fehler?
          vielen Dank,

          mfg, Andy

          1. Ich will nun das nur Montag markiert wird. Aber der script macht das nicht. Woran liegt der fehler?
            vielen Dank,

            Woher weißt du das nichts markiert wird?
            Hast du dir das Array @file ausgeben lassen?

            Struppi.

            1. Ich will nun das nur Montag markiert wird. Aber der script macht das nicht. Woran liegt der fehler?
              vielen Dank,

              Woher weißt du das nichts markiert wird?
              Hast du dir das Array @file ausgeben lassen?

              Struppi.

              ja habe ich, am anfang hatte ich die erste zeile vergessen
              open(FILE2, $ARGV[1])|| die "could not open file";
              Aber trotzdem es wird nun jede Buchstabe markiert??
              Bsp:<merk>h</mark><merk>e</mark><merk>e</mark><merk>t</mark><merk>e</mark>.

              Die liste mit meine Einträge enthält viele Zeilen!

              Was könnte schief gelaufen sein?

              Danke

              hier nochmal der Code:
              open(FILE1, $ARGV[0])|| die "could not open file";

              while(<FILE1>){
                chomp;
              @Felder=split(/,/,$_);
              }

              my $pattern = join '|', map quotemeta, @felder;

              open(FILE2, $ARGV[1])|| die "could not open file";
              while (<FILE2>)
              {
              chomp;
              s/($pattern)/<mark>$1</mark>/g;
              push @file, $_;
              print @file;
              }

              1. Bsp:<merk>h</mark><merk>e</mark><merk>e</mark><merk>t</mark><merk>e</mark>.

                Bei mir klappt das ohne Probleme.

                hier nochmal der Code:

                Hast du Warnungen eingeschaltet und use strict verwendet?

                Struppi.

                1. Bsp:<merk>h</mark><merk>e</mark><merk>e</mark><merk>t</mark><merk>e</mark>.

                  Bei mir klappt das ohne Probleme.

                  hier nochmal der Code:

                  Hast du Warnungen eingeschaltet und use strict verwendet?

                  Struppi.

                  hallo strupi,

                  kannst du mir bitte nochmal den Code mit dem bei dir funktioniert hat zuschicken, weil ich bin völlig verzweifelt. Ich habe tausend mal versucht und der Script markiert jede Buschstabe. Merkwürdig. Ich benutze gar kein Warnung oder use script.

                  Danke.

                  1. kannst du mir bitte nochmal den Code mit dem bei dir funktioniert hat zuschicken, weil ich bin völlig verzweifelt. Ich habe tausend mal versucht und der Script markiert jede Buschstabe. Merkwürdig. Ich benutze gar kein Warnung oder use script.

                    Der code unterscheidet sich nicht von dem, den ich dir geschickt habe und auch nicht von dem den du gepostet hast, aber ich nehme an das der umfangreicher ist.

                    Um Fehler zu finden und vor allem zu vermeiden ist use strict und der Schalter -w unumgänglich. Ich vermute irgendwo eine nicht initialisierte Variabel, die würdest du damit schnell finden.

                    Schreib am Anfang deines skriptes:
                    #!/usr/bin/perl -w
                    use strict;

                    und beseitige alle Warnungen und Fehlermeldungen die du erhälst, dann sollte es funktionieren.

                    Struppi.

                    1. Schreib am Anfang deines skriptes:
                      #!/usr/bin/perl -w
                      use strict;

                      und beseitige alle Warnungen und Fehlermeldungen die du erhälst, dann sollte es funktionieren.

                      Struppi.

                      hallo,

                      habe
                      #!/usr/bin/perl -w

                      use strict;

                      eigefügt und erhalte folgende error:

                      Global symbol "@felder" requires explicit package name at ..

                      Global symbol "@file" requires explicit package name at a ..
                      Global symbol "@file" requires explicit package name at a ..

                      was ist des für error meldung? Welches package wird gesucht??

                      danke

                      1. Hallo andy

                        Schreib am Anfang deines skriptes:
                        #!/usr/bin/perl -w
                        use strict;

                        und beseitige alle Warnungen und Fehlermeldungen die du erhälst, dann sollte es funktionieren.

                        Struppi.

                        hallo,

                        habe
                        #!/usr/bin/perl -w

                        use strict;
                        eigefügt und erhalte folgende error:

                        Global symbol "@felder" requires explicit package name at ..

                        Global symbol "@file" requires explicit package name at a ..
                        Global symbol "@file" requires explicit package name at a ..

                        was ist des für error meldung? Welches package wird gesucht??

                        Mit verlangt von dir, dass du die Variabeln deklarierst. Damit vermeidest du z.b. Tippfehler, da du keine undeklarierten Variabeln verwenden kannst.

                        Deklakrieren tust du mit my

                        my @file;
                        my @felder;

                        Struppi.

                        1. genau das habe ich mit "my variable" schon gemacht.
                          Der script lauft nun ohne fehler aber er tut immer noch das gleiche wie vorher. Also er markiert alle Buchstaben einzeln.
                          Bsp, "text.txt" : Morgen gehe ich ins Kino.
                          Bsp "einträge.txt": Morgen, Montag, Heute,

                          aufruf des Scripts: perl script.pl einträge.txt text.txt
                          kommt folgendes raus:

                          <mark>M</mark><mark>o</mark><mark>r</mark><mark>g</mark><mark>e</mark><mark>N</mark>... und alle weiteren wörtern werden genau so markiert auch die die nicht in der Einträge liste sind, wie gehe ins kino

                          Ich verstehe das Nicht. Wie so bei Ihnen funktioniert und bei mir nicht?

                          Danke

                          1. aufruf des Scripts: perl script.pl einträge.txt text.txt
                            kommt folgendes raus:

                            Ich kann es dir nicht sagen:

                            my $text_txt = 'Morgen gehe ich ins Kino. Das ist am Montag.';
                            my $eintraege_txt ='Morgen,Montag,Heute';
                            my @Felder = split(/,/, $eintraege_txt);

                            my $pattern = join '|', map quotemeta, @Felder;

                            $text_txt =~ s/($pattern)/<mark>$1</mark>/g;

                            print $text_txt ;

                            Klappt bei mri zumindest.

                            Struppi.