Schrift
[thread]7536[/thread]

Reguläre Ausdrücke auf mehrzeilige Eingabe

Leser: 2


<< >> 6 Einträge, 1 Seite
michael25
 2005-12-09 18:32
#60837 #60837
User since
2005-08-31
23 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe hier ein Problem mit regulären Ausdrücken, die auf eine mehrzeilige Zeichenkette angewandt werden soll. Vielleicht kann mir jemand helfen?

Folgender String ist gegeben:
output "Daten 1\n
Daten 2\n
..."

Auf die Zeilenvorschubzeichen kann ich leider nicht verzichten, da diese Ausgabe genauso in eine Datei geschrieben werden soll.
Folgender Code:

Code: (dl )
1
2
3
4
5
6
7
while (my $client = $server->accept) {
$client->autoflush(1);
while (<$client>) {

if (/^output/s) {
print $_;
}


Leider lautet die Ausgabe immer nur:
output "Daten 1

Lieber wäre mir:
output "Daten 1\n
Daten 2\n
..."

Weiß jemand Rat?
sesth
 2005-12-09 20:24
#60838 #60838
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Dein primäres Problem ist m-E. <$client>. Der Ausdruck liefert Dir jeweils nur eine Zeile. Du musst die Lineendings deaktivieren. Beim Regulären Ausdruck hilft die Option "m" für multiline.\n\n

<!--EDIT|sesth|1134152789-->
Gruß
Thomas
pq
 2005-12-09 20:24
#60839 #60839
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ja, /m anstatt /s benutzen.
perldoc perlre

edit: ändert vermutlich nix, wie sesth schon schrieb...\n\n

<!--EDIT|pq|1134152746-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
esskar
 2005-12-09 20:27
#60840 #60840
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du liest die datei ja nur zweilenweise ein und wendest dann den RegExp nur auf eine zeile an.

kommt der output teil nur einmal vor, heißt: willst du alles nach output haben ?
michael25
 2005-12-10 10:07
#60841 #60841
User since
2005-08-31
23 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

und danke für eure Tipps. Da könnte ich mich doch glatt selbst ohrfeigen. Ich meine, weil ich nicht darauf gekommen bin, dass hier zeilenweise eingelesen wird.

Naja, vermutlich Unwissenheit gepaart mit Freitag-Nachmittag-Syndrom...

Jetzt werde ich einfach die Zeilen zwischenspeichern und dann weiterverarbeiten.

Michael
Dubu
 2005-12-10 12:41
#60842 #60842
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Wenn du Anfang und Ende des interessierenden Bereiches gut ueber eine Regex bestimmen kannst, dann ist das eine gute Anwendung fuer den Flip-Flop-Operator:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use strict;
use warnings;


while (<DATA>) {
if (/^output\s+"/ .. /"\s*$/) {
print;
}
}

_ _DATA_ _
Hier ist Text vor der ersten
output-Zeile.
output "Daten 1\n
Daten 2\n
..."
hier steht was anderes.
noch was mit "Anfuehrungszeichen"
123 bla blubber 789
output "Daten 1\n
Daten 2\n
... noch was"
ups, hier ist
Ende

(Bitte wie ueblich _ _DATA_ _ durch __DATA__ ersetzen.)

Heraus kommt:
Code: (dl )
1
2
3
4
5
6
output "Daten 1\n
Daten 2\n
..."
output "Daten 1\n
Daten 2\n
... noch was"
<< >> 6 Einträge, 1 Seite



View all threads created 2005-12-09 18:32.