Grub: Datei - Zeile springen

Hi all,

ich hab eine Datei (Handle ist "LESEN"). Wenn ich einen bestimmten RegExp treffe, dann möchte ich diesen Ausgeben und die komplette nächste Zeile. Hab das jetzt so gelöst, aber find das nicht wirklich optimal:

while(<LESEN>)
{
if($x == 1) {print "$_";$x=0;next}
if( $_ =~ /BLA(\w+)/) { print "$1 ";$x=1}
}

Wie kann ich das eleganter machen?

ciao,
Grub

  1. Hi,

    ich hab eine Datei (Handle ist "LESEN"). Wenn ich einen bestimmten RegExp treffe, dann möchte ich diesen Ausgeben und die komplette nächste Zeile. Hab das jetzt so gelöst, aber find das nicht wirklich optimal:

    while(<LESEN>)
    {
    if($x == 1) {print "$_";$x=0;next}
    if( $_ =~ /BLA(\w+)/) { print "$1 ";$x=1}
    }

    Wie kann ich das eleganter machen?

    Ich wuerde die ganze Datei in einen String einlesen und auf diesen dann den RegExp anwenden.
    Das einlesen sollte kein Problem darstellen.

    Beispiel fuer das Verarbeiten:

      
    #!/usr/bin/perl -w  
      
    use strict;  
      
    my $fileString = "  
    asdfsdf  
    BLAafddsfdsfdf  
    hier  
    asdfsdf  
    asdfsdf  
    BLAasdfsdfdsf  
    dsfdsfdf  
    ";  
      
      
    while($fileString =~ /BLA\w+\n(.*)\n/g)  
    {  
        print "treffer: $1\n";  
    }  
    
    

    Je nach Betriebssystem kann es sein, dass ein Zeilenumbruch anders ist. dann muss das "\n" im regulaeren Ausdruck entsprechend angepasst werden.

    mfG,
    steckl

  2. ich hab eine Datei (Handle ist "LESEN"). Wenn ich einen bestimmten RegExp treffe, dann möchte ich diesen Ausgeben und die komplette nächste Zeile.

    #! /usr/bin/perl -w  
    use strict;  
      
    while(<DATA>) {  
     if( /BLA(\w+)/) {  
      my $next = <DATA>;  
      print $1,$next;  
      
     }  
    }  
    __DATA__  
    asdfsdf  
    BLAafddsfdsfdf  
    hier  
    asdfsdf  
    asdfsdf  
    BLAasdfsdfdsf  
    dsfdsfdf  
    
    

    Struppi.

    --
    Javascript ist toll (Perl auch!)
  3. while(<LESEN>)
    {
    if($x == 1) {print "$_";$x=0;next}
    if( $_ =~ /BLA(\w+)/) { print "$1 ";$x=1}
    }
    Wie kann ich das eleganter machen?

    Und noch 'ne Variante:

    my $pattern = 'BLA(\w+)';  
    while(<LESEN>) {  
      next unless /$pattern/;  
      print "$pattern found in line $.: $_";  
    }
    

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
    1. gudn tach!

      Und noch 'ne Variante:

      my $pattern = 'BLA(\w+)';

      while(<LESEN>) {
        next unless /$pattern/;
        print "$pattern found in line $.: $_";
      }

        
      hmm, ja, oder halt gleich  
        
      ~~~perl
      my $pattern = 'BLA(\w+)';  
      while(<LESEN>){  
        print "$pattern found in line $.: $_" if /$pattern/;  
      }
      

      aber das liefert noch nicht die naechste zeile.

      prost
      seth

      1. aber das liefert noch nicht die naechste zeile.

        Jupp, überlesen.

        my $pattern = 'BLA(\w+)';  
        my $found = 0;  
        while(<DATA>) {  
          next if (!/$pattern/ and !$found);  
          print $_ if $found;  
          $found = ($found ? 0 : 1);  
        }  
          
        __DATA__  
        asdfsdf  
        BLAafddsfdsfdf  
        hier  
        asdfsdf  
        asdfsdf  
        BLAasdfsdfdsf  
        dsfdsfdf
        

        Oder so ähnlich ;)

        Siechfred

        --
        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
        1. Jupp, überlesen.

          my $pattern = 'BLA(\w+)';

          my $found = 0;
          while(<DATA>) {
            next if (!/$pattern/ and !$found);
            print $_ if $found;
            $found = ($found ? 0 : 1);
          }

          Wieso denn so umständlich?
          Und es ist nich ganz was der OP wollte.

          [code lang=perl]while(<DATA>) {
          next if (!/$pattern/);
          my $next = <DATA>
          print $1, $next;
          }

            
          Struppi.
          
          -- 
          [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
          
          1. Hi

            while(<DATA>) {

            next if (!/$pattern/);
            my $next = <DATA>
            print $1, $next;
            }

            
            >   
            > Struppi.  
              
            Danke.  
            Was ich aber nicht verstehe ist, wieso in der Variable $next die nächste Zeile und nicht die aktuelle Zeile drin ist?  
            Danke für Aufklärung.  
              
            ciao,  
            Grub
            
            1. Hi,

              while(<DATA>) {

              next if (!/$pattern/);
              my $next = <DATA>
              print $1, $next;
              }

                
                
              
              > Danke.  
              > Was ich aber nicht verstehe ist, wieso in der Variable $next die nächste Zeile und nicht die aktuelle Zeile drin ist?  
                
              Mit <DATA> liest du immer die naechste Zeile aus dem File aus. Wenn das pattern nicht passt wird mit next wieder zum Schleifenanfang gesprungen und hier die naechste Zeile ausgelesen.  
              Wenn es passt wird die Zeile "my $next = <DATA>;" aufgerufen. Hier wird die naechste Zeile des Files in die Variable $next geschrieben.  
                
              Hoffe das ist so verstaendlich fuer dich.  
                
              mfG,  
              steckl
              
              1. Hi,

                while(<DATA>) {

                next if (!/$pattern/);
                my $next = <DATA>
                print $1, $next;
                }

                
                >   
                >   
                > > Danke.  
                > > Was ich aber nicht verstehe ist, wieso in der Variable $next die nächste Zeile und nicht die aktuelle Zeile drin ist?  
                >   
                > Mit <DATA> liest du immer die naechste Zeile aus dem File aus. Wenn das pattern nicht passt wird mit next wieder zum Schleifenanfang gesprungen und hier die naechste Zeile ausgelesen.  
                > Wenn es passt wird die Zeile "my $next = <DATA>;" aufgerufen. Hier wird die naechste Zeile des Files in die Variable $next geschrieben.  
                >   
                > Hoffe das ist so verstaendlich fuer dich.  
                >   
                > mfG,  
                > steckl  
                
                Hallo,  
                  
                das war nicht ganz das was ich wissen wollte. Vielleicht habe ich meine Frage falsch formuliert.  
                Wieso ist im Filehandle <DATA> bei der Zuweisung an $next der Inhalt der "nächsten" Zeile und nicht der "aktuelle" Zeile?  
                Das bei "while" das Filehandle auf die nächste Zeile hüpft ist mir bewusst. Nur bin ich verwirrt, dass dies ebenfalls bei einer Zuweisung geschieht.  
                  
                ciao,  
                Grub  
                
                
                1. Wieso ist im Filehandle <DATA> bei der Zuweisung an $next der Inhalt der "nächsten" Zeile und nicht der "aktuelle" Zeile?

                  Weil <FH> im Skalaren Kontext immer die nächste Zeile liest.

                  Das bei "while" das Filehandle auf die nächste Zeile hüpft ist mir bewusst. Nur bin ich verwirrt, dass dies ebenfalls bei einer Zuweisung geschieht.

                  Es gibt da keinen Unterschied ob du das in einer Schleife machst oder nicht.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
                2. Hi,

                  versuche sinnvoll zu zitieren.

                  Wieso ist im Filehandle <DATA> bei der Zuweisung an $next der Inhalt der "nächsten" Zeile und nicht der "aktuelle" Zeile?
                  Das bei "while" das Filehandle auf die nächste Zeile hüpft ist mir bewusst. Nur bin ich verwirrt, dass dies ebenfalls bei einer Zuweisung geschieht.

                  while(<DATA>) {

                  next if (!/$pattern/);
                    my $next = <DATA>
                    print $1, $next;
                  }

                    
                  macht das gleiche wie:  
                  ~~~perl
                    
                  while($zeile = <DATA>) {  
                    next if ($zeile !~ /$pattern/);  
                    my $next = <DATA>  
                    print $1, $next;  
                  }  
                  
                  

                  nur dass bei while(<DATA>) der Inhalt der Zeile statt in $zeile in $_ geschrieben wird. Es ist also auch eine Zuweisung. Die Spezialvariable $_ wird immer dann verwendet, wenn keine andere angegeben ist.

                  Zu testzwecken kannst du ja mal $_ mit print ausgeben.

                  mfG,
                  steckl

          2. Wieso denn so umständlich?

            Weil in Perl so viele Wege zum Ziel führen, dass man so manches Mal die Abkürzung übersieht ;)

            Siechfred

            --
            Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.