Datei - Zeile springen
Grub
- perl
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
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
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.
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
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
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
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!)
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
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
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
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.
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
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