Perl Anfänger: String Zeilenweise durchlaufen

0 72

String Zeilenweise durchlaufen

Perl Anfänger
  • perl
  1. 0
    Horst
    1. 0
      Perl Anfänger
      1. 0
        Struppi
        1. 0
          Perl Anfänger
          1. 1
            Patrick Andrieu
            1. 0
              Perl Anfänger
              1. 0

                Nachtrag

                Perl Anfänger
              2. 0
                Patrick Andrieu
                1. 0
                  Perl Anfänger
                  1. 0
                    Patrick Andrieu
                    1. 0
                      Perl Anfänger
                      1. 0
                        Patrick Andrieu
                        1. 1
                          Siechfred
                          1. 0
                            Patrick Andrieu
                          2. 0
                            Perl Anfänger
                            1. 0
                              Patrick Andrieu
                              1. 0
                                Patrick Andrieu
                                1. 0
                                  MudGuard
                    2. 0
                      Perl Anfänger
              3. 0
                Struppi
                1. 0
                  Patrick Andrieu
                  1. 0
                    MudGuard
                    1. 0
                      Patrick Andrieu
                      1. 0
                        MudGuard
                        1. 0
                          Patrick Andrieu
                          1. 0
                            MudGuard
                            1. 0
                              Patrick Andrieu
                2. 0
                  Perl Anfänger
                  1. 0
                    Struppi
                    1. 0
                      Perl Anfänger
                      1. 0
                        Patrick Andrieu
                        1. 0
                          Perl Anfänger
                          1. 0
                            Kurt Z
                            1. 0
                              Perl Anfänger
                              1. 0
                                Patrick Andrieu
                              2. 0
                                Kurt Z
                    2. 0
                      Patrick Andrieu
                      1. 0
                        Struppi
                        1. 0
                          Patrick Andrieu
                          1. 0
                            Perl Anfänger
                            1. 0
                              Patrick Andrieu
            2. 0
              Siechfred
              1. 0
                Patrick Andrieu
                1. 0
                  Siechfred
                  1. 0
                    Struppi
                    1. 0
                      Siechfred
                  2. 0
                    Patrick Andrieu
          2. 0

            so in der Art?

            Kurt Z
            1. 0
              Kurt Z
              1. 0
                Perl Anfänger
              2. 0
                Siechfred
                1. 0
                  Kurt Z
                  1. 0
                    Siechfred
                    1. 0
                      Kurt Z
                      1. 0
                        Siechfred
                        1. 0

                          Iterartorvariable

                          Kurt Z
                          1. 0
                            Siechfred
                            1. 0
                              Kurt Z
              3. 0
                Perl Anfänger
                1. 0
                  Kurt Z
                  1. 0
                    Perl Anfänger
                    1. 0
                      Kurt Z
                      1. 0
                        _Perl_ Anfänger ;-)
                        1. 0
                          Kurt Z
                          1. 0
                            Perl Anfänger
                            1. 0
                              Kurt Z
                              1. 0
                                Perl Anfänger
                                1. 0
                                  Siechfred
                                  1. 0
                                    Kurt Z
                                  2. 0
                                    Perl Anfänger
                                2. 0
                                  Kurt Z

Hi!

wie kann ich ein String in Perl 5.8.8 Zeilenweise durchlaufen?

Bei "while($string){..}" erhalte ich folgende Fehlermeldung

Use of uninitialized value in pattern match (m//) at /xyz/test.pl line 43, <STDIN> line 18.
Use of uninitialized value in concatenation (.) or string at /xyz/ line 48, <STDIN> line 18.

verwende ich stattdessen "while(<STDIN>){...}" läuft das Script durch

Danke

  1. Hallo,

    wie kann ich ein String in Perl 5.8.8 Zeilenweise durchlaufen?

    Falls der String Zeilenumbruchzeichen enthält, mach ein Array daraus, das geht mit split():

    my @array = split("\n", $string);

    Somit kannst Du mit

    foreach my $zeile(@array){}

    den String quasi "zeilenweise" durchlaufen.

    Viele Grüße,
    Horst Haselhuhn

    1. Hi

      wie kann ich ein String in Perl 5.8.8 Zeilenweise durchlaufen?

      Falls der String Zeilenumbruchzeichen enthält, mach ein Array daraus, das geht mit split():

      my @array = split("\n", $string);

      Somit kannst Du mit

      foreach my $zeile(@array){}

      den String quasi "zeilenweise" durchlaufen.

      jetzt muss ich nur noch rausbekommen, wie ich den aktuellen Index bearbeiten kann

      Danke

      1. jetzt muss ich nur noch rausbekommen, wie ich den aktuellen Index bearbeiten kann

        Wozu?

        Struppi.

        1. jetzt muss ich nur noch rausbekommen, wie ich den aktuellen Index bearbeiten kann

          Wozu?

          ich möchte bei jeder Zeile prüfen, ob ein regulärer Ausdruck passt, wenn er passt, möchte ich am Ende dieser Zeile etwas anhängen
          wenn der reguläre Ausdruck bei keiner Zeile zutrifft, möchte ich am Ende etwas einfügen

          Danke

          1. Hallo Perl!

            ich möchte bei jeder Zeile prüfen, ob ein regulärer Ausdruck passt, wenn er passt, möchte ich am Ende dieser Zeile etwas anhängen
            wenn der reguläre Ausdruck bei keiner Zeile zutrifft, möchte ich am Ende etwas einfügen

            Du bist aber auch sparsam mit Auskünften...

            Wo kommen die Daten her? Aus einer Datei? Dann ist while (<FILEHANDLE>) für ein zeilenweises Einlesen doch die bessere Wahl:

            open (DATEI, ">>blubb.blabb") or die "Open failed: $!";
            while (<DATEI>) {
              print DATEI "$_ und das was Du einfügen willst\n" if (/PATTERN/);
            }
            close DATEI;

            Sollte eine neue Datei erstellt werden, mit den Änderungen, dann so:

            open (DATEI, "originaldatei.foo") or die "Open DATEI failed: $!";
            open (OUT, ">>neuedatei.bar") or die "Open OUT failed: $!";
            while (<DATEI>) {
              print OUT "$_ und das was Du einfügen willst\n" if (/PATTERN/);
            }
            close OUT;
            close DATEI;

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --

            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?
            1. Hi!

              ich möchte bei jeder Zeile prüfen, ob ein regulärer Ausdruck passt, wenn er passt, möchte ich am Ende dieser Zeile etwas anhängen
              wenn der reguläre Ausdruck bei keiner Zeile zutrifft, möchte ich am Ende etwas einfügen

              Du bist aber auch sparsam mit Auskünften...

              Wo kommen die Daten her? Aus einer Datei? Dann ist while (<FILEHANDLE>) für ein zeilenweises Einlesen doch die bessere Wahl:

              open (DATEI, ">>blubb.blabb") or die "Open failed: $!";
              while (<DATEI>) {
                print DATEI "$_ und das was Du einfügen willst\n" if (/PATTERN/);
              }
              close DATEI;

              Sollte eine neue Datei erstellt werden, mit den Änderungen, dann so:

              open (DATEI, "originaldatei.foo") or die "Open DATEI failed: $!";
              open (OUT, ">>neuedatei.bar") or die "Open OUT failed: $!";
              while (<DATEI>) {
                print OUT "$_ und das was Du einfügen willst\n" if (/PATTERN/);
              }
              close OUT;
              close DATEI;

              sorry, dass das zuwenig Informationen waren!

              bis jetzt habe ich folgenden Code

              my @stdin = <STDIN>;

              my $i;
              for ($i = 0; $i < @stdin; $i++){
                $stdin[$i] = $stdin[$i] . ",WORT2\n" if($stdin[$i] =~ /[1]*#{0,0}\bWORT1\b/ );
              }
              $stdin[$i] = qq~WORT1 WORT2\n~;

              ...

              for ($i = 0; $i < @stdin; $i++){
                print $stdin[$i];
              }

              Danke!


              1. \t ↩︎

              1. Hi

                sorry, dass das zuwenig Informationen waren!

                bis jetzt habe ich folgenden Code

                my @stdin = <STDIN>;

                my $i;
                for ($i = 0; $i < @stdin; $i++){
                  $stdin[$i] = $stdin[$i] . ",WORT2\n" if($stdin[$i] =~ /[1]*#{0,0}\bWORT1\b/ );
                }
                $stdin[$i] = qq~WORT1 WORT2\n~;

                ...

                for ($i = 0; $i < @stdin; $i++){
                  print $stdin[$i];
                }

                ich hab vergessen zu sagen, dass ich noch das Problem habe, dass wenn das WORT1 gefunden wurde, das Wort WORT2 hintendran gehängt wird, Aber... davor ist wohl ein \n, wodurch das WORT2 in einer neuen Zeile geschrieben wird

                Desweiteren habe ich das Problem, dass "$stdin[$i] = qq~WORT1 WORT2\n~;" nur am Ende eingefügt werden soll, wenn vorher der reguläre Ausdruck auf keine Zeile gepasst hat

                Danke!


                1. \t ↩︎

              2. Hallo Perl!

                Wenn Du <STDIN> als Handle benutzt, dann ist der Weg über ein Array nicht gut. Horst hat Dir den Tipp gegeben, weil er davon ausging, dass Dir ein String mit Zeilenumbrüchen vorliegt, wie:

                my $str = "Meerjungfraumann\nund Blaubarschbube\nfinden das unsichtbare\nBootmobil nicht";

                In deinem Fall würde ich es so lösen:

                while (<STDIN>) {
                  print "$_" . ", WORT2\n" if /[1]*#{0,0}\bWORT1\b/;
                }

                ich hab vergessen zu sagen, dass ich noch das Problem habe, dass wenn das WORT1 gefunden wurde, das Wort WORT2 hintendran gehängt wird, Aber... davor ist wohl ein \n, wodurch das WORT2 in einer neuen Zeile geschrieben wird

                Das dürfte sich erledigt haben, und das:

                Desweiteren habe ich das Problem, dass "$stdin[$i] = qq~WORT1 WORT2\n~;" nur am Ende eingefügt werden soll, wenn vorher der reguläre Ausdruck auf keine Zeile gepasst hat

                verstehe ich nicht ganz. Probier erst mit while und sowas Ähnlichem wie mein Beispeil und berichte über die Probleme, die dann kommen.

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?

                1. \t ↩︎

                1. Hi

                  Wenn Du <STDIN> als Handle benutzt, dann ist der Weg über ein Array nicht gut. Horst hat Dir den Tipp gegeben, weil er davon ausging, dass Dir ein String mit Zeilenumbrüchen vorliegt, wie:

                  der übergebene STDIN beinhaltet Zeileumbrüche (\n)

                  my $str = "Meerjungfraumann\nund Blaubarschbube\nfinden das unsichtbare\nBootmobil nicht";

                  In deinem Fall würde ich es so lösen:

                  while (<STDIN>) {
                    print "$_" . ", WORT2\n" if /[1]*#{0,0}\bWORT1\b/;
                  }

                  ich kann es nicht gleich ausgeben, da ich falls keine Ersetzung stattgefunden hat, am Ende eine neue Zeile einfügen muss

                  Danke!


                  1. \t ↩︎

                  1. Hallo Perl!

                    while (<STDIN>) {

                    ^^ War sowieso nicht weiter gedacht von mir: obiges reagiert ja nach jeder Eingabe (auf der Konsole nach jedem Drücken von [ENTER]) ;)

                    print "$_" . ", WORT2\n" if /[1]*#{0,0}\bWORT1\b/;

                    ich kann es nicht gleich ausgeben, da ich falls keine Ersetzung stattgefunden hat, am Ende eine neue Zeile einfügen muss

                    Hm, das ist aber immer noch unklar. Welche »Ersetzung«? In dem von Dir gezeigten Beispiel bisher, da hast Du nur ein Suchmuster, aber keine Ersetzung...

                    Ich fasse zusammen, was ich verstanden habe:

                    WORT2 soll hinzugefügt werden, wenn in einer Zeile WORT1 gefunden wurde.
                    Die Zeile soll durch WORT1 WORT2 erstezt werden, wenn nichts gefunden wurde.

                    Korrekt oder liege ich neben der Tastatur? ;)

                    Viele Grüße aus Frankfurt/Main,
                    Patrick

                    --

                    _ - jenseits vom delirium - _
                    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                    Nichts ist unmöglich? Doch!
                    Heute schon gegökt?

                    1. \t ↩︎

                    1. Hi!

                      while (<STDIN>) {

                      ^^ War sowieso nicht weiter gedacht von mir: obiges reagiert ja nach jeder Eingabe (auf der Konsole nach jedem Drücken von [ENTER]) ;)

                      print "$_" . ", WORT2\n" if /[1]*#{0,0}\bWORT1\b/;

                      Hm, das ist aber immer noch unklar. Welche »Ersetzung«? In dem von Dir gezeigten Beispiel bisher, da hast Du nur ein Suchmuster, aber keine Ersetzung...

                      ok, ich meinte Anhängen :-)

                      Ich fasse zusammen, was ich verstanden habe:

                      WORT2 soll hinzugefügt werden, wenn in einer Zeile WORT1 gefunden wurde.

                      richtig

                      Die Zeile soll durch WORT1 WORT2 erstezt werden, wenn nichts gefunden wurde.

                      leider nein, diese Zeile soll am Ende eingefügt werden, wenn vorher keine Zeile mit WORT1 gefunden wurde

                      Danke!


                      1. \t ↩︎

                      1. Hallo!

                        OK. Quick & Dirty bevor ich heia geh...
                        Nur einmal getestet und... geht ganz bestimmt eleganter:

                          
                        use strict;  
                        chomp (my @eingabe = <STDIN>);  
                        my $check = 0;  
                          
                          
                        foreach (@eingabe) {  
                          $check++ && next if (/Meerjungfraumann/) # Das wäre WORT1  
                        }  
                        if ($check > 0) {  
                          foreach my $eingabe (@eingabe) {  
                            $eingabe .= " und Blaubarschbube" if ($eingabe =~ /Meerjungfraumann/);  
                            print $eingabe, "\n";  
                          }  
                        }  
                        else {  
                          foreach (@eingabe) {  
                            print $_, "\n";  
                          }  
                          print "Und so muss es sein!"; # das wäre WORT1 WORT2  
                        }  
                        
                        

                        Wenn »Meerjungfraumann« in der ganzen Eingabe nicht vorkommt, wird am Ende »Und so muss es sein!« eingefügt, wenn aber nur eine Zeile »Meerjungfraumann« enthält, wird dies ergänzt mit " und Blaubarschbube".

                        Tests. Eingabe 1:

                        foo
                        bar
                        buz

                        Ausgabe:
                        foo
                        bar
                        buz
                        Und so muss es sein!

                        Eingabe 2:

                        Meerjungfraumann
                        Patrick Star
                        Sponge Bob bewundert Meerjungfraumann

                        Ausgabe:
                        Meerjungfraumann und Blaubarchbube
                        Patrick Star
                        Sponge Bob bewundert Meerjungfraumann und Blaubarschbube

                        Viele Grüße aus Frankfurt/Main,
                        Patrick

                        --

                        _ - jenseits vom delirium - _
                        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                        Nichts ist unmöglich? Doch!
                        Heute schon gegökt?
                        1. OK. Quick & Dirty bevor ich heia geh...

                          Ähm, noch'n Gedicht:

                          use strict;  
                          use Data::Dumper;  
                            
                          my $pattern = 'doedel';  
                          my @lines = <DATA>;  
                          chomp @lines;  
                          {  
                            push @lines, 'not found' and last unless grep { /$pattern/ } @lines;  
                            @lines = map( _test($_), @lines );  
                          }  
                          print Dumper \@lines;  
                            
                          sub _test {  
                            local $_ = shift;  
                            return $_ .= (/$pattern/ ? '...found!' : '');  
                          }  
                            
                            
                          __DATA__  
                          laber  
                          rhabarber  
                          rhabarbera  
                          rhabarbara  
                          haberlabera
                          

                          Hach, Listenverarbeitung mit Perl macht einfach Spaß :)

                          Siechfred

                          --
                          Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                          1. Hallo Siechfred!

                            Ähm, noch'n Gedicht:

                            Gerne mehr davon!

                            push @lines, 'not found' and last unless grep { /$pattern/ } @lines;
                              @lines = map( _test($_), @lines );

                            Und ich wollte letztens nach schönen Anwendungsbeispielen für grep() und map() oder auch für Schwartzsche Trafo fragen... ;)

                            Hach, Listenverarbeitung mit Perl macht einfach Spaß :)

                            Ich seh's ;)

                            Viele Grüße aus Frankfurt/Main,
                            Patrick

                            --

                            _ - jenseits vom delirium - _
                            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                            Nichts ist unmöglich? Doch!
                            Heute schon gegökt?
                          2. Hi

                            use strict;

                            use Data::Dumper;

                            my $pattern = 'doedel';
                            my @lines = <DATA>;
                            chomp @lines;
                            {
                              push @lines, 'not found' and last unless grep { /$pattern/ } @lines;
                              @lines = map( test($), @lines );
                            }
                            print Dumper @lines;

                            sub test {
                              local $
                            = shift;
                              return $_ .= (/$pattern/ ? '...found!' : '');
                            }

                              
                            den Code versteh ich nicht wirklich :-)  
                              
                            könntest du den bitte erklären?  
                            das sieht auf jedenfall interessant aus!  
                              
                            Danke!
                            
                            1. Hallo Perl!

                              den Code versteh ich nicht wirklich :-)»»
                              könntest du den bitte erklären?

                              Vielleicht kann ich das versuchen (Siechfred kann mich ja korrigieren *g*)...

                              use strict;
                              use Data::Dumper;

                              Pragma (strict), Modul Data::Dumper einbinden.

                              my $pattern = 'doedel';

                              Suchmuster in eine Variable speichern

                              my @lines = <DATA>;

                              Hier könnte auch: my @lines = <SDTIN>; stehen. Mit DATA kann man aber besser testen, es muss halt am Ende des Skripts ein DATA- Bereich geben.

                              chomp @lines;

                              Entferne aus jedem Element vom Array @lines das Newline-Zeichen (\n oder \r oder \r\n, je nach Plattform)

                              {
                                push @lines, 'not found' and last unless grep { /$pattern/ } @lines;

                              Füge am Ende von @lines ein neues Element mit Wert 'not found' UND beende die Aktion WENN das Suchmuster auf KEIN Element von @lines matcht (unless ist nahezu gleichzusetzen mit dem Gegenteil von if)
                              and hat niedrigere (oder war das höhere) Prezedenz als ||, jedenfalls kann deswegen hier auf Klammerung verzichtet werden

                              @lines = map( test($), @lines );

                              Wende jedem Element von @lines ($_) die Funktion _test() an. @lines wird so mit den (evtl.) geänderten Werten gefüllt. Das greift erst dann, wenn kein »last« (aus der Zeile zuvor) die Aktion abgebrochen hat, also sobald doch das Suchmuster »entdeckt« wurde

                              sub test {
                                local $
                              = shift; # Hier ist mir das noch nicht klar...
                                return $_ .= (/$pattern/ ? '...found!' : '');

                              return in einer Funktion gibt immer das Ergebnis der letzen Anweisung zurück. Diese ist:

                              $_ .= (/$pattern/ ? '...found!' : '');

                              ^Zeichenketten verküpfung (entspricht $_ = $_ . "...")

                                
                                
                              Zwischen den Klammer ist eine einfache if/else-Abfrage, gleichbedeutend mit:  
                                
                              Wenn Suchausdruck matcht, füge ...found hinzu, sonst nichts (Leerstring).  
                                
                              \--------------------  
                              [map()](http://de.selfhtml.org/perl/funktionen/listenhashes.htm#map) - perldoc -f map  
                              [grep()](http://de.selfhtml.org/perl/funktionen/listenhashes.htm#grep) - perldoc -f grep  
                              [strict](http://de.selfhtml.org/perl/module/standardmodule.htm#pragma_module)  
                              [return](http://de.selfhtml.org/perl/funktionen/kontrolle.htm#return)  
                                
                              
                              > das sieht auf jedenfall interessant aus!  
                                
                              Sieht nicht aus, ist.  
                                
                              ;)  
                                
                              Viele Grüße aus Frankfurt/Main,  
                              Patrick
                              
                              -- 
                              ![](http://www.atomic-eggs.com/fuernA.jpg)  
                                
                              \_ - jenseits vom delirium - \_  
                                
                              [[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash](http://www.atomic-eggs.com/)]  
                              Nichts ist unmöglich? [Doch!](http://www.atomic-eggs.com/cwi/cwi_4.shtml)  
                              Heute schon ge[gök](http://goek.atomic-eggs.com/goek_goek.html)t?
                              
                              1. Wer oder und und verwechselt...

                                and hat niedrigere (oder war das höhere) Prezedenz als ||,

                                Bitte lesen: ... als &&   ;)

                                Viele Grüße aus Frankfurt/Main,
                                Patrick

                                --

                                _ - jenseits vom delirium - _
                                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                Nichts ist unmöglich? Doch!
                                Heute schon gegökt?
                                1. Hi,

                                  and hat niedrigere (oder war das höhere) Prezedenz als ||,
                                  Bitte lesen: ... als &&   ;)

                                  Omas Haushaltstipp Nr. 420815: &-Zeichen nach dem Bügeln unbedingt mit dem Lockenstab nachbehandeln ...

                                  cu,
                                  Andreas

                                  --
                                  Warum nennt sich Andreas hier MudGuard?
                                  O o ostern ...
                                  Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                    2. Hi

                      +------------------------------------+
                      | check = 0                          |
                      +------------------------------------+
                      |    while(<STDIN>)                  |
                      |    +-------------------------------+
                      |    | \  Passt Zeile auf reg.     / |
                      |    |    \   Ausdruck          /    |
                      |    |       \               /       |
                      |    |          \         /          |
                      |    | TRUE        \   /       FALSE |
                      |    +-------------------------------+
                      |    |               |               |
                      |    | ", WORT2"     |               |
                      |    | anfügen       |               |
                      |    |               |               |
                      |    | check = 1     |               |
                      |    |               |               |
                      +------------------------------------+
                      | \        Ist check = 0           / |
                      |    \                          /    |
                      |       \                    /       |
                      |          \              /          |
                      |             \        /             |
                      | TRUE           \  /         FALSE  |
                      +------------------------------------+
                      | Zeile anhängen   |                 |
                      +------------------------------------+

                      ich hoffe das hilft etwas :-)

              3. sorry, dass das zuwenig Informationen waren!

                Jau.

                bis jetzt habe ich folgenden Code

                my @stdin = <STDIN>;

                Hm, Demo?
                Du liest mehrere Zeilen von STDIN, ich weiß das das geht, aber du kannst in Perl - z.b. um lauffähige Beispiele, mit Daten, zu zeigen __DATA__ benutzen.

                Am Ende einer Datei:
                __DATA__
                Deine Beispieldatei
                über mehrere
                Zeilen

                und im Skript mit:
                my @stdin = <DATA>;
                einlesen. Aber das nur Rande.

                my $i;
                for ($i = 0; $i < @stdin; $i++){

                Ich glaub kaum jemand der in Perl programmiert, macht so eine Schleife.

                foreach (@stdin){

                reicht.

                $stdin[$i] = $stdin[$i] . ",WORT2\n" if($stdin[$i] =~ /[1]*#{0,0}\bWORT1\b/ );
                }
                $stdin[$i] = qq~WORT1 WORT2\n~;

                den Regulären Ausdruck verstehe ich nicht (ich bin schlecht darin), deshalb ist mir nicht klar was du genau hier machen willst, aber du kannst, wenn die du die Variante von mir benutzt, hier auf $_ zugreifen.

                Du willst das Newline entfernen?
                Nimm chomp!

                Es wäre interessant, was du genau machen willst.

                for ($i = 0; $i < @stdin; $i++){
                  print $stdin[$i];
                }

                print foreach @stdin;

                oder
                print @stdin;

                Struppi.


                1. \t ↩︎

                1. Hallo Struppi!

                  den Regulären Ausdruck verstehe ich nicht (ich bin schlecht darin),

                  Das habe ich vergessen zu fragen. Nehmen wir ihn doch auseinander:

                  /
                  ^           # Matche am Stringanfang...
                  [ \t]*      # ...eine Zeichenklasse aus einem Leerzeichen und einem Tab bestehend, beliebig oft vorkommend...
                  #{0,0}      # gefolgt von einem Rautezeichen, das kein Mal vorkommt (warum nicht gleich [^#]?)
                  \bWORT1\b   # das Wort »WORT1« in Wortgrenzen
                  /

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --

                  _ - jenseits vom delirium - _
                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                  Nichts ist unmöglich? Doch!
                  Heute schon gegökt?
                  1. Hi,

                    #{0,0}      # gefolgt von einem Rautezeichen, das kein Mal vorkommt (warum nicht gleich [^#]?)

                    #{0,0} "frißt" kein Zeichen und ist absolut sinnfrei.
                    [^#] dagegen "frißt" ein Zeichen.

                    /a#{0,0}/ matcht bei a# - der Treffer besteht hier aus dem 'a'
                    Auch /a#{0,0}#/ matcht bei a# (hier ist der Treffer 'a#').

                    Der gegebene Ausdruck sucht nach
                    evtl. Whitespace (genauer: Leerzeichen oder Tabs), gefolgt von WORT1

                    Die Wort-Grenze \b vor WORT1 ist auch überflüssig, da davor nur der Stringanfang oder Whitespace stehen darf (also sowieso eine Wortgrenze gegeben ist).

                    Also reicht /[1]*WORT1\b/ vollkommen.

                    cu,
                    Andreas

                    --
                    Warum nennt sich Andreas hier MudGuard?
                    O o ostern ...
                    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

                    1. \t ↩︎

                    1. Hallo MudGuard!

                      evtl. Whitespace (genauer: Leerzeichen oder Tabs), gefolgt von WORT1
                      Also reicht /[1]*WORT1\b/ vollkommen.

                      my $str = "     WORT1"; #ein Leerzeichen und ein Tab, auch mehrere möglich
                      print "BINGO" if $str =~ /^\s*WORT1/;
                      ^Z
                      BINGO

                      Also reicht /^\s*WORT1/ vollkommen ;)

                      »\s« weil, da Zeilenweise eingelesen und vom Beginn der Zeile an gesucht wird (»^«), ausgeschlossen wird, dass auch \r\n durch \s gematcht wird.

                      Viele Grüße aus Frankfurt/Main,
                      Patrick

                      --

                      _ - jenseits vom delirium - _
                      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                      Nichts ist unmöglich? Doch!
                      Heute schon gegökt?

                      1. \t ↩︎

                      1. Hi,

                        Also reicht /^\s*WORT1/ vollkommen ;)

                        Nein, das ist etwas _vollkommen_ anderes ;-)

                        1. würde ohne das \b am Ende dann auch " WORT1WORT2" gematcht.
                        2. \s matcht mehr Zeichen als Leerzeichen, Tab, Carriage Return und Linefeed. Z.B. auch formfeed. Also ist selbst bei zeilenweisem Lesen [ \t] nicht äquivalent zu \s.

                        cu,
                        Andreas

                        --
                        Warum nennt sich Andreas hier MudGuard?
                        O o ostern ...
                        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                        1. Hallo MudGuard!

                          1. würde ohne das \b am Ende dann auch " WORT1WORT2" gematcht.

                          Ja, das war mein Versäumnis, da mich nur der Anfang ([ \t] vs. \s) interessiert hat, hatte ich nach dem Posten gesehen

                          1. \s matcht mehr Zeichen als Leerzeichen, Tab, Carriage Return und Linefeed. Z.B. auch formfeed.

                          Ja, \f. Ich kann mir darunter aber nichts vorstellen ;) Wäre mal die Gelegenheit, mir das zu erklären ;)

                          In welcher Art von Dateien kommt denn der Seitenvorschub vor?

                          Viele Grüße aus Frankfurt/Main,
                          Patrick

                          --

                          _ - jenseits vom delirium - _
                          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                          Nichts ist unmöglich? Doch!
                          Heute schon gegökt?
                          1. Hi,

                            In welcher Art von Dateien kommt denn der Seitenvorschub vor?

                            In denen, die einen Seitenvorschub enthalten ;-)

                            z.B. Textdateien, die für den Ausdruck bestimmt sind und die Seitenumbrüche an bestimmten Stellen haben sollen, nicht zufällig da, wo die Seite voll ist.

                            cu,
                            Andreas

                            --
                            Warum nennt sich Andreas hier MudGuard?
                            O o ostern ...
                            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                            1. Hallo MudGuard!

                              In denen, die einen Seitenvorschub enthalten ;-)

                              Hätte ich echt nicht gedacht...

                              z.B. Textdateien, die für den Ausdruck bestimmt sind und die Seitenumbrüche an bestimmten Stellen haben sollen, nicht zufällig da, wo die Seite voll ist.

                              Licht geht an (ist ja auch später als 5 nach 8, und ohne BlackOut)! In EditPad erscheint immer eine seltsame Linie, wenn ich [Strg] + ENTER drücke. Du hast mich auf die Idee gebracht, mir das mal in der Druckansicht anzuschauen: Tatsächlich sind es dann zwei Seiten...

                              Ein print auf der Konsole (Windoof) bringt allerdings dieses Zeichen, das mich eher daran erinnert, dass ich langsam auf Brautschau gehen sollte...

                              Meerjungfraumann
                              ♀Blaubarschbube
                              Drecksackblase
                              ♀Mantarochen

                              Aber ja... jetzt wird mir auch klar warum »\f«. Steht wohl für »female« ;)

                              Viele Grüße aus Frankfurt/Main,
                              Patrick

                              --

                              _ - jenseits vom delirium - _
                              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                              Nichts ist unmöglich? Doch!
                              Heute schon gegökt?
                2. Hi!

                  my $i;
                  for ($i = 0; $i < @stdin; $i++){

                  Ich glaub kaum jemand der in Perl programmiert, macht so eine Schleife.

                  :-)
                  ist das so schlimm? ^^

                  Es wäre interessant, was du genau machen willst.

                  ich möchte überprüfen ob WORT1 vorkommt, dann soll das WORT2 durch ein Komma getrennt angehängt werden - wenn das Wort WORT2 nicht gefunden wurde, soll am Ende WORT1 WORT2 angefügt werden.

                  Danke!

                  1. my $i;
                    for ($i = 0; $i < @stdin; $i++){

                    Ich glaub kaum jemand der in Perl programmiert, macht so eine Schleife.

                    :-)
                    ist das so schlimm? ^^

                    Ja.

                    Es wäre interessant, was du genau machen willst.

                    ich möchte überprüfen ob WORT1 vorkommt, dann soll das WORT2 durch ein Komma getrennt angehängt werden - wenn das Wort WORT2 nicht gefunden wurde, soll am Ende WORT1 WORT2 angefügt werden.

                    So?

                      
                    #!/usr/bin/perl -w  
                      
                    use strict;  
                    while(<DATA>) {  
                    chomp;  
                    my $line = $_ . ( /\bWORT1\b/  ? ', WORT2'  : 'WORT1 WORT2');  
                    print "$line\n";  
                    }  
                    __DATA__  
                    bla bla bla WORT1  
                    bla bla bla  
                    bla WORT1 bla bla  
                    bla WORT1bla bla  
                    bla bla bla  
                    
                    

                    Struppi.

                    1. Hi

                      hier ist mein Code, der im Moment das tut, was ich verlange

                      #!/usr/bin/perl -w  
                        
                      use DBI;  
                      use strict;  
                        
                      my @stdin = <STDIN>;  
                      my $id = 0;  
                        
                      $id = ....  
                        
                      if($id > 0){  
                        my $check = 0;  
                        foreach(@stdin){  
                          $_ = chomp($_).",WORT2\n" if($_ =~ /^[ \t]*[^#]?\WORT1\b/ and $check = 1);  
                        }  
                        push @stdin, "WORT1 WORT2\n" if($check == 0);  
                      }  
                      print foreach @stdin;
                      

                      ob das jetzt nahc perl-manier ist, kann ich leider nicht beurteilen

                      Danke!

                      1. Hallo Perl!

                        $id = ....

                        ^diese Zeile gehört wohl nicht hin...

                        $_ = chomp($_).",WORT2\n" if($_ =~ /[1]*[^#]?\WORT1\b/ and $check = 1);

                        ........................................................................^
                        Das ist hier eine Wertzuweisung, keine Überprüfung/Vergleich (==).

                        Viele Grüße aus Frankfurt/Main,
                        Patrick

                        --

                        _ - jenseits vom delirium - _
                        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                        Nichts ist unmöglich? Doch!
                        Heute schon gegökt?

                        1. \t ↩︎

                        1. Hi

                          $id = ....

                          ^diese Zeile gehört wohl nicht hin...

                          die ID wird über mehrere Zeilen ermittelt, ich wollte das mit ... etwas kürzen

                          $_ = chomp($_).",WORT2\n" if($_ =~ /[1]*[^#]?\WORT1\b/ and $check = 1);
                          ........................................................................^
                          Das ist hier eine Wertzuweisung, keine Überprüfung/Vergleich (==).

                          wenn ich daraus ein vergleich machen würde, würde die Bedingung nie Wahr werden.
                          Wenn der Ausdruck gefunden wurde, setze ich den Wert der Variable auf 1, damit nach der Schleife, die Zeile nicht angefügt wird

                          Danke!


                          1. \t ↩︎

                          1. Hallo

                            $_ = chomp($_).",WORT2\n" if($_ =~ /[1]*[^#]?\WORT1\b/ and $check = 1);
                            ........................................................................^
                            Das ist hier eine Wertzuweisung, keine Überprüfung/Vergleich (==).

                            hmm, wer so coded ist bestimmt kein Anfänger, aber leider auch kein Profi ...

                            stell dir vor du schaust dir den Code in einem halben Jahr nochmal an, dann wirste erstmal in die gleiche Falle tappen wie Patrick.

                            Du verbiegst dir nix wenn du stattdessen schreibst

                            if( $_ =~ /[2]*[^#]?\WORT1\b/ ) {
                                $_ = chomp($_).",WORT2\n";
                                $check = 1;
                            }

                            übrigens der Witz beim $_ ist es ihn möglichst oft einzusparen, wenn
                            du ihn immer explizit nutzt dann nimm lieber einen sprechenden Variablennamen wie $zeile.

                            deine RegEx ist etwas kryptisch, klamüsern wirs auseinander

                              
                            m{  
                              ^            # anfang der Zeile  
                              [ \t]*       # beliebig viele Whitespaces, warum nicht \s* ?  
                              [^#]?        # ein oder kein Zeichen dass nicht # ist  
                              \W           # ein nicht Wort zeichen  
                              ORT1         # diese Zeichenkette  
                              \b           # Wortgrenze  
                            }x  
                              
                            
                            

                            ORT1 naja wohl ein schreibfehler???

                            das ist übrigens ein gültiger RegEx Code dank des x Flags kannste Leerzeichen und Kommentare einfügen und mit {} statt // wirds auch lesbarer.

                            Bye
                             Kurt


                            1. \t ↩︎

                            2. \t ↩︎

                            1. Hi

                              Du verbiegst dir nix wenn du stattdessen schreibst

                              if( $_ =~ /[1]*[^#]?\WORT1\b/ ) {
                                  $_ = chomp($_).",WORT2\n";
                                  $check = 1;
                              }

                              ok!

                              deine RegEx ist etwas kryptisch, klamüsern wirs auseinander

                              m{
                                ^            # anfang der Zeile
                                [ \t]*       # beliebig viele Whitespaces, warum nicht \s* ?
                                [^#]?        # ein oder kein Zeichen dass nicht # ist
                                \W           # ein nicht Wort zeichen
                                ORT1         # diese Zeichenkette
                                \b           # Wortgrenze
                              }x

                              
                              >   
                              > ORT1 naja wohl ein schreibfehler???  
                              
                              davor ist mir das b flötten gegangen ;-)  
                                
                                
                              
                              > das ist übrigens ein gültiger RegEx Code dank des x Flags kannste Leerzeichen und Kommentare einfügen und mit {} statt // wirds auch lesbarer.  
                                
                              wofür steht am Anfang das m?  
                                
                              Danke!
                              

                              1. \t ↩︎

                              1. Hallo Perl Anfänger!

                                wofür steht am Anfang das m?

                                https://forum.selfhtml.org/?t=163303&m=1063498

                                Es gibt hier nicht sehr viele Perl-Threads. Also kann sich jemand, der sich für Perl interessiert, alle lesen!

                                Von der Hauptdatei des Forums aus, kannst du Dir nur die Perl-Threads anzeigen lassen (siehe ganz oben) ;)

                                Viele Grüße aus Frankfurt/Main,
                                Patrick

                                --

                                _ - jenseits vom delirium - _
                                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                Nichts ist unmöglich? Doch!
                                Heute schon gegökt?
                              2. Hi

                                das ist übrigens ein gültiger RegEx Code dank des x Flags kannste Leerzeichen und Kommentare einfügen und mit {} statt // wirds auch lesbarer.

                                wofür steht am Anfang das m?

                                match!

                                tip mal:

                                perldoc -f m
                                       m//     The match operator.  See perlop.

                                Perl ist so voller Abkürzungen das man die Vollformen nicht mehr kennt.

                                /RegEx/ ist nur eine abkürzung für m/RegEx/

                                will man aber andere Klammern benutzen (z.B. weil man / im Ausdruck hat) nimmt man gerne was anderes, (sehr häufig #)

                                m#Regex#

                                oder

                                m{RegEx}

                                Vergleiche auch substitute s///

                                das sich auch s{RegEx}{substitute} oder s/RegEx/substitute/ schreiben lässt.

                                da Perl einem viele Freiheiten lässt sollte man es nicht zusehr übertreiben.

                                / und # reichen für kurze ausdrücke
                                {} sind bei mehrzeilern lesbarer

                                tschau
                                 Kurt

                    2. Hallo Struppi!

                      my $line = $_ . ( /\bWORT1\b/  ? ', WORT2'  : 'WORT1 WORT2');

                      Das ist aber nicht ganz, was »Perl Anfänger« erreichen will. Ich hatte zuerst auch das verstanden, weswegen ich ihm am Ende quasi die Würmer aus der Nase ziehen musste ;)

                      Die Zeichenkette »WORT1 WORT2« soll nur dann _am Ende der gesamten Eingabe_ hinzugefügt werden sollen, wenn in keiner Zeile »WORT1« vorkommt. Wenn aber »WORT1« vorkommt, soll(en) die jeweilige(n) Zeile(n) durch », WORT2« ergänzt werden.

                      Das ewige Problem einer zutreffenden Problembeschreibung... Außerdem hat er uns sein RegExp noch nicht erklärt... ;)

                      Viele Grüße aus Frankfurt/Main,
                      Patrick

                      --

                      _ - jenseits vom delirium - _
                      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                      Nichts ist unmöglich? Doch!
                      Heute schon gegökt?
                      1. my $line = $_ . ( /\bWORT1\b/  ? ', WORT2'  : 'WORT1 WORT2');

                        Die Zeichenkette »WORT1 WORT2« soll nur dann _am Ende der gesamten Eingabe_ hinzugefügt werden sollen, wenn in keiner Zeile »WORT1« vorkommt.

                        In keiner oder nicht in der Aktuellen?

                        Wenn aber »WORT1« vorkommt, soll(en) die jeweilige(n) Zeile(n) durch », WORT2« ergänzt werden.

                        Das macht die Zeile

                        Struppi.

                        1. Hallo Struppi!

                          Die Zeichenkette »WORT1 WORT2« soll nur dann _am Ende der gesamten Eingabe_ hinzugefügt werden sollen, wenn in keiner Zeile »WORT1« vorkommt.

                          In keiner oder nicht in der Aktuellen?

                          In keiner. Aber zuerst dachte ich auch wie Du:

                          Ich:
                               WORT2 soll hinzugefügt werden, wenn in einer Zeile WORT1
                               gefunden wurde.
                               Die Zeile soll durch WORT1 WORT2 erstezt werden, wenn nichts
                               gefunden wurde.

                          Darauf hin der OP:

                          WORT2 soll hinzugefügt werden, wenn in einer Zeile WORT1
                            gefunden wurde.

                          richtig

                          Die Zeile soll durch WORT1 WORT2 erstezt werden, wenn nichts
                            gefunden wurde.

                          leider nein, diese Zeile soll am Ende eingefügt werden,
                               wenn vorher keine Zeile mit WORT1 gefunden wurde

                          Viele Grüße aus Frankfurt/Main,
                          Patrick

                          --

                          _ - jenseits vom delirium - _
                          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                          Nichts ist unmöglich? Doch!
                          Heute schon gegökt?
                          1. Hi

                            Die Zeile soll durch WORT1 WORT2 erstezt werden, wenn nichts
                              gefunden wurde.
                                 leider nein, diese Zeile soll am Ende eingefügt werden,
                                 wenn vorher keine Zeile mit WORT1 gefunden wurde

                            stimmt, WORT1 WORT2 soll ganz am Ende als eine neue Zeile hinzugefügt werden, wenn Wort1 nicht gefunden wurde

                            Danke

                            1. Hallo Perl!

                              ^^ Irgendwann schmeiß ich meine Forumseinstellung raus, ist mir bei Dem Martin weiter oben wieder passiert :)

                              stimmt, WORT1 WORT2 soll ganz am Ende als eine neue Zeile hinzugefügt werden, wenn Wort1 nicht gefunden wurde

                              Und jetzt hast Du, TIMTOWTDI sei Dank, verschiedene Beispiele, die das auch machen ;)

                              Viele Grüße aus Frankfurt/Main,
                              Patrick

                              --

                              _ - jenseits vom delirium - _
                              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                              Nichts ist unmöglich? Doch!
                              Heute schon gegökt?
            2. Wo kommen die Daten her? Aus einer Datei? Dann ist while (<FILEHANDLE>) für ein zeilenweises Einlesen doch die bessere Wahl:

              Nein, in den meisten Fällen ist Tie::File die beste Wahl.

              Siechfred

              --
              Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
              1. Hallo Siechfred!

                Nein, in den meisten Fällen ist Tie::File die beste Wahl.

                Hm...

                use Tie::File;
                chdir "desktop" or die $!;
                my @arr;
                tie @arr, 'Tie::File', "fehlende.txt" or die $!;
                print $arr[0];

                Ausgabe sofort (»fehlende.txt« besteht aus 10 Zeilen aus den Logs)

                use Tie::File;
                chdir "desktop" or die $!;
                my @arr;
                tie @arr, 'Tie::File', "Oktober_2007.txt" or die $!;
                print $arr[0];
                ^Z

                Seit einer viertel Stunde blinkt der Cursor... »Oktober_2007.txt« besteht aus 309514 Zeilen.

                Cite: »The file is not loaded into memory, so this will work even for gigantic files.«

                Hm, eben...

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
                1. Seit einer viertel Stunde blinkt der Cursor... »Oktober_2007.txt« besteht aus 309514 Zeilen.

                  Die größte Textdatei, die ich hier gefunden habe, hat knapp 80.000 Zeilen. Wende ich darauf Tie::File an, dauert es eine gefühlte Sekunde und ich habe über den Array vollen Zugriff auf alle Zeilen. Irgendwas scheint da bei Dir nicht zu stimmen, denke ich.

                  Siechfred

                  --
                  Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                  1. Seit einer viertel Stunde blinkt der Cursor... »Oktober_2007.txt« besteht aus 309514 Zeilen.

                    Irgendwas scheint da bei Dir nicht zu stimmen, denke ich.

                    Falls die Dateien von Patrick Serverlogs sind, wird es wohl der Zeilenumbruch sein.
                    Server -> Linux <-> Lokal -> Windows
                    Oder?

                    Struppi.

                    1. Irgendwas scheint da bei Dir nicht zu stimmen, denke ich.
                      Falls die Dateien von Patrick Serverlogs sind, wird es wohl der Zeilenumbruch sein.
                      Server -> Linux <-> Lokal -> Windows

                      Jo, könnte sein. Evtl. hilft es, bei tie recsep explizit zu setzen.

                      Siechfred

                      --
                      Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                  2. Hallo Siechfred!

                    Seit einer viertel Stunde blinkt der Cursor... »Oktober_2007.txt« besteht aus 309514 Zeilen.
                    Die größte Textdatei, die ich hier gefunden habe, hat knapp 80.000 Zeilen. Wende ich darauf Tie::File an, dauert es eine gefühlte Sekunde und ich habe über den Array vollen Zugriff auf alle Zeilen. Irgendwas scheint da bei Dir nicht zu stimmen, denke ich.

                    Keine Ahnung, was Tie::File an meiner »Oktober_2007.txt« nicht mag. Aber so baut man sich einen Ruf als Tester:

                    Man nehme die »fehlende.txt«, die ja aus 10 Log-Zeilen bestand, und kopiere immer wieder den Inhalt neu.

                    100000 Zeilen -> kein Problem
                    200000 Zeilen -> kein Problem
                    300000 Zeilen -> kein Problem (Reaktionszeit zur Ausgabe der letzten Zeile: ca. 9 sek.)

                    Okidoki. Man benenne die Datei in Oktober_2008.txt um -> kein Problem

                    Man nehme wieder die echte Datei Oktober_2007.txt -> blinkender Cursor.
                    Man benenne die Oktober_2007.txt als nervnet.txt um -> blinkender Cursor.
                    Man nehme die November_2007.txt (293478 Zeilen) -> blinkender Cursor.
                    Man nehme die September_2007.txt (269969 Zeilen) -> blinkender Cursor.

                    Blinkender Cursor: für die Zeit, die ich brauche, einen oder zwei Forumsbeiträge zu lesen. Dann breche ich mit [Strg] + [C] ab. Ach übrigens: Gibt Perl die Meldung: »Terminating on signal SIGINT(2)« oder kommt sie vom Betriebssystem? ;)

                    Man muss editpad.exe über den Taskmanager killen, nach dem der Versuch, den Inhalt von November_2007.txt in fehlende.txt zu kopieren, fehlschlägt, lese zwischendurch Struppis Hinweis mit dem Zeilenumbruch, stellt fest, dass diese in der Tat mit dem UNIX-Zeilenumbruch enstanden sind, will das ändern, muss wieder EditPad killen, weil keine Rückmeldung, hat keine Lust mehr und wendet sich anderen Aufgaben ;)

                    Fazit: Du hast Recht, ich habe Recht. Tie::File kann sehr wohl mit »gigantic files« umgehen - nur mit meinen nicht!

                    Man gebe EditPad eine zweite Chance, nachdem man auf die TV-Nachrichten verzichtet und auf andere, speicherfressende Programme, schafft das, auf CRLF umzuspeichern und siehe da: es FUNZT(tm)!

                    Zweites Fazit: Du hast Recht, Struppi hat Recht, Tie::File hat Recht und ich sorge für Unterhaltung ;)

                    Nur... warum spielt denn der Zeilenumbruch eine Rolle?

                    Viele Grüße aus Frankfurt/Main,
                    Patrick, startet jetzt die Kiste neu. Mann kennt ja Windows Speicherverwaltung, ich hab's gerne frisch ;)

                    --

                    _ - jenseits vom delirium - _
                    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                    Nichts ist unmöglich? Doch!
                    Heute schon gegökt?
          2. Hi

            ich möchte bei jeder Zeile prüfen, ob ein regulärer Ausdruck passt, wenn er passt, möchte ich am Ende dieser Zeile etwas anhängen
            wenn der reguläre Ausdruck bei keiner Zeile zutrifft, möchte ich am Ende etwas einfügen

            Sorry die geposteten Beispiele erscheinen mir irgendwie zu kompliziert, $_ ist doch bereits ein Alias auf den laufenden Index!

            du willst doch folgendes, oder?

              
              
            my $match_flag=0;  
            my $pattern="2";  
            my $wort2="Anhang Zeile";  
            my $wort3="Anhang Datei";  
              
              
            my @arr=(<DATA>); #hier knnte STDIN stehen  
            for $_ (@arr) {  
              chomp;  
              if (/$pattern/) {  
               $_.="\t".$wort2;  
               $match_flag=1;  
              }  
            }  
            push (@arr,$wort3) if not ($match_flag); # TIMTOWD unless...  
              
              
            # Ausgabe  
            $,="\n";  
            print @arr;  
              
              
            __DATA__  
            z1  
            z2  
            z3  
            
            

            Gruß
             Kurt

            1. Hi

              kleine Korrekturen:

              for $_ (@arr) {

                
              ist natürlich doppelt gemoppelt ...  
                
               ~~~Perl
                
              for (@arr) {  
               
              

              reicht vollkommen!

              Allerdings wärs für die Wartbarkeit größerer Schleifen besser die Iterationsvariable auch zu benennen:

              for my $x (@arr) {
                chomp $x;
                if ( $x =~ /$pattern/ ) {
                 $x.="\t".$wort2;
                 $match_flag=1;
                }
              }

              das "my" könnte man sich übrigens auch sparen, Iterationsvariablen sind immer privat.

              Bye
               Kurt

              du willst doch folgendes, oder?

              tja werde ich wohl nie erfahren

              Gruß
              Kurt

              1. Hi

                du willst doch folgendes, oder?

                tja werde ich wohl nie erfahren

                ich werde leider erst morgen oder übermorgen dazu kommen das zu testen.
                Die Antwort kommt auf jeden Fall!

                Danke

              2. das "my" könnte man sich übrigens auch sparen, Iterationsvariablen sind immer privat.

                Soweit richtig (halte ich für einen konzeptionellen Fehler, aber die Diskussion ist müßig), allerdings verlangt das strict-Pragma nach my. Und dass man dieses Pragma verwenden sollte, ist mittlerweile anerkannte Grundregel der Perlprogrammierung. Also: Man schreibe my, obwohl man es nicht müsste, um das strict-Pragma zufriedenzustellen.

                Siechfred

                --
                Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                1. Hallo

                  Soweit richtig (halte ich für einen konzeptionellen Fehler,

                  hmgmeme ... naja ... man kann die sache von zwei seiten betrachten

                  CONTRA: wieso kann ich nie Abgreifen was der Inhalt der letzten Iterationsschleife ist, ohne eine extra Variable zu definieren.

                  PRO: Es ist zu gefährlich dem letzten alias im Schleifenkörper rauszulassen, schließlich ist es ein lvalue und bei einer Zuweisung könnte versehentlich ein Element der Liste verändert werden.

                  aber die Diskussion ist müßig)

                  einfach nicht antworten :)

                  Also: Man schreibe my, obwohl man es nicht müsste, um das strict-Pragma zufriedenzustellen.

                  leider nein, aber es wär der bessere STil my zu schreiben...

                  #~~~Perl

                  use strict;

                  print "Wer irrt sich ?\t";
                  my $x="Siechfred";
                  print $x."? ";

                  for $x (qw(Damian Kurt)) { #$x OHNE my
                   print $x."? ";
                  }

                  print uc("\n\n $x irrt sich!!!\n");

                    
                  Bye  
                   Kurt  
                    
                  
                  
                  1. Soweit richtig (halte ich für einen konzeptionellen Fehler,
                    hmgmeme ... naja ... man kann die sache von zwei seiten betrachten

                    Welche zwei Seiten? Entweder ich respektiere die zwei Variablensätze Package- und lexikalische Variablen und die damit verbundene Regel, dass erstere mit Packagequalifier zu notieren und zweitere vor Gebrauch mit my zu deklarieren sind, oder nicht.

                    Also: Man schreibe my, obwohl man es nicht müsste, um das strict-Pragma zufriedenzustellen.
                    leider nein, aber es wär der bessere STil my zu schreiben...

                    Es ist zwingend erforderlich. Dass Dein Beispiel funktioniert, liegt an der Deklaration von $x vor der Schleife und im selben Scope. Verwendest Du eine Iterationsvariable in der Schleife, die zuvor nicht mit my deklariert wurde, bekommst Du einen Fehler und das Script stirbt.

                    Siechfred

                    --
                    Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                    1. Hallo

                      Welche zwei Seiten?

                      es geht um die Iterationsvariable.

                      Es ist zwingend erforderlich. Dass Dein Beispiel funktioniert, liegt an der Deklaration von $x vor der Schleife und im selben Scope.

                      ja aber es handelt sich um zwei verschiedene $x Variablen, wie das Beispiel zeigt. Die zwote ist privat zur Schleife OHNE mit my deklariert worden zu sein.

                      Deine These 'strict' würde einen sowieso zwingen bei Iteratorvariablen 'my' zu nutzen ist leider so nicht richtig, leider!

                      Eigentlich ein Mangel von "strict", oder?

                      Ciao
                       Kurt

                      PS: man kann das Buch nicht oft genug loben: Perl Best Practices

                      1. Deine These 'strict' würde einen sowieso zwingen bei Iteratorvariablen 'my' zu nutzen ist leider so nicht richtig, leider!

                        Doch, ist sie. Perl meckert bei Deinem Beispiel nur deshalb nicht, weil $x deklariert war.

                        Eigentlich ein Mangel von "strict", oder?

                        Nein, m.E. ein Mangel im Perlkonzept. So, wie Du es in Deinem Beispiel geschrieben hast, würde man eine lexikalische Variable manipulieren, tut man aber nicht. Würde man my weglassen und die Variable nirgendwo anders im selben Scope deklarieren, würde man eine Packagevariable manipulieren, tut man aber auch nicht.

                        Es existiert nur ein einziger Weg, lexikalische Variablen zu deklarieren, nämlich via my (so lese ich jedenfalls perlsub). Tut man dies nicht, erhält man automatisch eine Packagevariable. Und in dieses Konzept passen die Iterationsvariablen nicht rein, sie sind weder lexikalisch (wenn ohne my deklariert) noch Packagevariablen ($main::x ist undef).

                        Siechfred

                        --
                        Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                        1. Hi

                          Es existiert nur ein einziger Weg, lexikalische Variablen zu deklarieren, nämlich via my (so lese ich jedenfalls perlsub). Tut man dies nicht, erhält man automatisch eine Packagevariable. Und in dieses Konzept passen die Iterationsvariablen nicht rein, sie sind weder lexikalisch (wenn ohne my deklariert) noch Packagevariablen ($main::x ist undef).

                          Tatsächlich richtet es sich nachd eräßeren deklaration, was sich aber nur innerhalb der Schleife auswirkt und außerhalb keinen messbaren Unterschied ausmacht:

                          http://perldoc.perl.org/perlsyn.html#Foreach-Loops

                          "If the variable is preceded with the keyword my, then it is lexically scoped, and is therefore visible only within the loop. Otherwise, the variable is implicitly local to the loop and regains its former value upon exiting the loop. If the variable was previously declared with my, it uses that variable instead of the global one, but it's still localized to the loop. This implicit localisation occurs only in a foreach loop."

                          konkret:

                          #~~~Perl

                          use strict;

                          print "Wer irrt sich ?\t";
                          our $x="Perl";
                          my $y="Perl";

                          for $x (qw(Siechfred)) {
                           print $main::x."? "; #: Siechfred?
                          }

                          for $y (qw( Kurt)) {
                           print $y."? ";       #: Kurt?
                          }

                          print uc("\n\n $x! Ja $y irrt sich!!!\n"); #: PERL! JA PERL IRRT SICH!!!

                            
                          Also du hast recht dass die Iteratorvariable nicht implizit "my" ist, und ich hab recht das strict mich nicht dazu zwingt diese explizit zu deklarieren um diese Verwirrung zu vermeiden.  
                            
                          INSBESONDERE ergibt sich ein deutlicher Unterschied wenn innerhalb der Schleife eine Subroutine aufgerufen wird die auf globale Variablen zugreift.  
                            
                          #~~~Perl
                            
                            
                          use strict;  
                            
                          print "Wer irrt sich ?\t";  
                          our $x="Perl";  
                          my $y="Perl";  
                            
                            
                            
                            
                          for $x (qw(Siechfred)) {  
                           say();    #: ich sag: Siechfred Perl  
                          }  
                            
                            
                            
                          for $y (qw( Kurt)) {  
                           say();    #: ich sag: Perl Perl  
                           closure();  
                            
                           sub closure {  
                            print "\n closure: $y"; #: closure: Perl  
                           }  
                          }  
                            
                            
                          print uc("\n\n $x! Ja $y irrt sich!!!\n"); #: PERL! JA PERL IRRT SICH!!!  
                            
                            
                          sub say {  
                           print "\nich sag: $x $y\n";  
                          }  
                            
                            
                          #
                          

                          FAZIT: Vorsicht mit Iteratorvariablen ...

                          Gruß
                            kurt

                          1. ich hab recht das strict mich nicht dazu zwingt diese explizit zu deklarieren um diese Verwirrung zu vermeiden.

                            Fast: strict zwingt Dich dann dazu, wenn die Variable *zuvor und im selben Scope* nicht deklariert wurde. In Deinen Beispielen tust Du das. Mal ein anderes Beispiel:

                            for $x (1..3) {  
                              print $x;  
                            }  
                              
                            # lexical scope?  
                            print $x;       # use of uninitialized value...  
                            # package variable?  
                            print $main::x; # use of uninitialized value...
                            

                            Lasse obigen Code unter srict laufen, und das Script stirbt.

                            FAZIT: Vorsicht mit Iteratorvariablen ...

                            Sehe ich nicht so. Zwei Möglichkeiten hat man: entweder man verwendet eine zuvor deklarierte Variable, was m.E. schlechter Stil ist, oder man deklariert die Iterationsvariable ausdrücklich mit my. Die Redundanz der Deklaration mit my ist das, was ich als Konzeptfehler ansehe, denn die Iterationsvariable ist, wie wir ja festgestellt haben, von Haus aus privat, sodass my eigentlich überflüssig ist.

                            Btw, say ist doch Perl6-Syntax, oder irre ich mich?

                            Siechfred

                            --
                            Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                            1. Hi

                              Btw, say ist doch Perl6-Syntax, oder irre ich mich?

                              ja!

                              ciao
                               kurt

              3. hi

                du willst doch folgendes, oder?

                tja werde ich wohl nie erfahren

                entspricht das nicht ungefähr https://forum.selfhtml.org/?t=163194&m=1063073?
                Die Bedingung habe ich nun verbessert ;-)

                Du verwendest for ich foreach, macht das ein Unterschied?

                was macht

                $,="\n";

                ?

                Danke!

                1. Hi

                  entspricht das nicht ungefähr https://forum.selfhtml.org/?t=163194&m=1063073?

                  ungefähr aber lesbarer und wartbarer!

                  Du verwendest for ich foreach, macht das ein Unterschied?

                  Nein mal wieder ne Perlabkürzung für foreach.

                    
                  $,="\n";  
                  
                  

                  Ich wollte das Array schöner mit Zeilenumbruch ausgeben.

                  kleiner Tipp, wenn du was nicht verstehst dann hilft googlen!

                  zb liefert die suche nach "perldoc $,':

                  The output field separator for the print operator. If defined, this value is printed between each of print's arguments. Default is undef. (Mnemonic: what is printed when there is a "," in your print statement.)

                  Bye
                   Kurt

                  1. Hi

                    entspricht das nicht ungefähr https://forum.selfhtml.org/?t=163194&m=1063073?

                    ungefähr aber lesbarer und wartbarer!

                    ist deins oder meins lesbarer und wartbarer?

                    Du verwendest for ich foreach, macht das ein Unterschied?

                    Nein mal wieder ne Perlabkürzung für foreach.

                    $,="\n";

                    
                    >   
                    > Ich wollte das Array schöner mit Zeilenumbruch ausgeben.  
                      
                    ich müßte dann noch ein for oder foreach in mein else zweig haben, damit ich bei $id=0 auch die Zeilenumbrüche entfernern kann  
                      
                      
                    
                    > kleiner Tipp, wenn du was nicht verstehst dann hilft googlen!  
                    >   
                    > zb liefert die suche nach "perldoc $,':  
                    >   
                    > The output field separator for the print operator. If defined, this value is printed between each of print's arguments. Default is undef. (Mnemonic: what is printed when there is a "," in your print statement.)  
                      
                    ok  
                    Danke!
                    
                    1. Hi

                      ist deins oder meins lesbarer und wartbarer?

                      hehe ... also für mich meins... aber ich glaube du bist
                      jetzt kein Anfänger mehr und weißt was du tust.

                      Tschau
                       Kurt

                      1. Hi

                        ist deins oder meins lesbarer und wartbarer?

                        hehe ... also für mich meins... aber ich glaube du bist
                        jetzt kein Anfänger mehr und weißt was du tust.

                        ich habe auch Perl-Anfänger geschrieben ;-)

                        sonst schreibe ich in python oder php :-)

                        trotzdem Danke!

                        1. Hi

                          sonst schreibe ich in python oder php :-)

                          Eine wunderbare gelegenheit diesen Thread zu beleben :)

                          Was gefällt dir den besser?

                          Gruß
                           Kurt

                          1. Hi

                            sonst schreibe ich in python oder php :-)

                            Eine wunderbare gelegenheit diesen Thread zu beleben :)

                            Was gefällt dir den besser?

                            in python fehlen mir die Geschweiften Klammern und die Semikolons ;-)
                            Super finde ich das eine Methode eine Funktion beinhalten kann.
                            yield und lambda sich auch super Sachen

                            Mit php programmiere ich seit Anfang 2001.
                            ich verwende es für Konsolenprogramme und Websites (CGI)
                            dbo finde ich besser als dbi von Perl

                            zu Perl kann ich noch nicht viel sagen, da ich damit noch nicht viel gemacht habe
                            Ich habe zwar damals mit Perl angefangen, hab es dann aber genauso schnell sein lassen :-)
                            PHP gefiel mir damals besser

                            Perl kann ziemlich kryptisch aussehen ^^

                            Bash Programme muss ich bei uns in der Firma relativ häufig schreiben :-)

                            in C, C# und Java habe ich eher Grundkenntnisse, weshalb ich dazu nichts sagen möchte ;-)

                            Danke!

                            1. Hi

                              Was gefällt dir den besser?

                              in python fehlen mir die Geschweiften Klammern und die Semikolons ;-)

                              Mir auch, ich wette ohne diese Einstigeshürde hätte Python schon den Scriptingmarkt monopolisiert.

                              Super finde ich das eine Methode eine Funktion beinhalten kann.

                              Genestete Subroutinen gibts auch in Perl... falls du das meinst.

                              yield und lambda sich auch super Sachen

                              bin kein Python Experte aber,
                              "yield" sollte man in Perl mit Closures realisieren können
                              "lambda" mit anonymen Subroutinen.

                              Ich habe zwar damals mit Perl angefangen, hab es dann aber genauso schnell sein lassen :-)

                              Ich bin hängengeblieben, und stutze es mir zusammen... überall vorhanden, riesige Libraries, ungeahnte Möglichkeiten.

                              Perl kann ziemlich kryptisch aussehen ^^

                              Das Tolle an Perl:   DU hast wahnsinnige syntaktische Möglichkeiten...
                              Das Schlimme an Perl:  Die anderen haben wahnsinnige syntaktische Möglichkeiten...

                              ;-)

                              Bash Programme muss ich bei uns in der Firma relativ häufig schreiben :-)

                              ächz ... es gibt einen Spruch der besagt das bei Programmen unter 100 Zeilen Perl unschlagbar sei... bei Bash liegt diese Grenze bei 10 ;)

                              Danke!

                              Bitte!

                              1. Hi

                                Super finde ich das eine Methode eine Funktion beinhalten kann.

                                Genestete Subroutinen gibts auch in Perl... falls du das meinst.

                                mit den Begriff kann ich nichts anfangen

                                yield und lambda sich auch super Sachen

                                bin kein Python Experte aber,
                                "yield" sollte man in Perl mit Closures realisieren können
                                "lambda" mit anonymen Subroutinen.

                                das werde ich mir mal anschauen

                                Ich habe zwar damals mit Perl angefangen, hab es dann aber genauso schnell sein lassen :-)

                                Ich bin hängengeblieben, und stutze es mir zusammen... überall vorhanden, riesige Libraries, ungeahnte Möglichkeiten.

                                Perl kann ziemlich kryptisch aussehen ^^

                                Das Tolle an Perl:   DU hast wahnsinnige syntaktische Möglichkeiten...
                                Das Schlimme an Perl:  Die anderen haben wahnsinnige syntaktische Möglichkeiten...

                                ;-)

                                du sagst es :-)

                                Bash Programme muss ich bei uns in der Firma relativ häufig schreiben :-)

                                ächz ... es gibt einen Spruch der besagt das bei Programmen unter 100 Zeilen Perl unschlagbar sei... bei Bash liegt diese Grenze bei 10 ;)

                                mein aktuelles Bashskript, das ich schreibe hat ungefähr 600 Zeilen ^^

                                Funktionen
                                Datenbankabfragen
                                Schleifen
                                Zeichenkettenoperationen
                                Diffs von Dateien
                                Make aufrufe
                                python Scripte werden aufgerufen
                                etc.

                                Der Durchlauf dauert ca. 10h :-)

                                die Bash ist auch ziemlich mächtig ;-)

                                Danke!

                                1. Super finde ich das eine Methode eine Funktion beinhalten kann.
                                  Genestete Subroutinen gibts auch in Perl... falls du das meinst.
                                  mit den Begriff kann ich nichts anfangen

                                  Vermutlich sind verschachtelte Subs gemeint:

                                  use strict;  
                                    
                                  sub foo {  
                                    my $wert = shift;  
                                    return bar($wert);  
                                    sub bar { return $_[0] * 2 }  
                                  }  
                                    
                                  print foo(2);  
                                  print foo(4);
                                  

                                  Siechfred

                                  --
                                  Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                                  1. Hello

                                    Vermutlich sind verschachtelte Subs gemeint:

                                    Thats right, mir is das doitsche word for "Nesting" nikt more remember!

                                    ;) neudeutsche Grüße
                                      Kurt

                                  2. Hi

                                    Super finde ich das eine Methode eine Funktion beinhalten kann.
                                    Genestete Subroutinen gibts auch in Perl... falls du das meinst.
                                    mit den Begriff kann ich nichts anfangen

                                    Vermutlich sind verschachtelte Subs gemeint:

                                    use strict;

                                    sub foo {
                                      my $wert = shift;
                                      return bar($wert);
                                      sub bar { return $_[0] * 2 }
                                    }

                                    print foo(2);
                                    print foo(4);

                                      
                                    ist das sauberes oder eher unsauberes programmieren, wenn man lokale Funktionen verwendet?  
                                      
                                    ich finde das ziemlich nützlich :-)  
                                      
                                    Danke!
                                    
                                2. Hi

                                  mein aktuelles Bashskript, das ich schreibe hat ungefähr 600 Zeilen ^^

                                  wie krank ... aber zugegeben bei mir sind aus Einzeilern in der Shell auch schon mal hunderte Zeilen geworden.

                                  die Bash ist auch ziemlich mächtig ;-)

                                  klar, aber die Syntax war noch schlimmer als bei Perl.
                                  Musste man nicht z.B. Bercehnungen in $() oder [[ ]] oder ähnlichem klammern ...

                                  wenn du Shellscripting magst bist du bei Perl gut aufgehoben, viele Sachen werden einem erst klar wenn man die Vorbilder kennt.

                                  Cheers
                                   KurtZ