Schrift
[thread]6367[/thread]

Reguläre Ausdrücke auf Textdatei anwenden



<< >> 6 Einträge, 1 Seite
Phobeus
 2004-06-26 21:53
#83747 #83747
User since
2004-06-26
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,
das Ganze ist sicherlich eine Anfänger-Frage, allerdings bin ich auch noch ein Anfänger, der nun versucht hat nach den ersten Übungen ein kleines Tool zu schreiben und dabei kurz vorm Nervenzusammenbuch steht. die Grundidee ist simple eine Textdatei wird eingelesen, verschiedene RegExp drauf angewendet und dann soll das ganze wieder gespeichert werden. Ich kann zwar die RegExp wunderbar auf $_ anwenden, scheitere allerdings daran, diese nicht nur auf die erste Ziele, sondern allen Zeilen der Datei anzuwenden.
Daher hier eine simpler Auszug aus der Problemregion:
Code: (dl )
1
2
3
4
5
6
#!/usr/bin/perl -w
open SOURCE,"<$ARGV[0]";
@zeilen = <SOURCE>;
@zeilen =~s/ü/&ü/g;
close SOURCE;
print @zeilen;

Ich kann zwar wunderbar mit @zeilen den Inhalt der Datei auflisten allerdings wird der Aufruf des RegExp kommentiert wie folgt:
Quote
Applying substitution (s///) to @array will act on scalar(@array) at ./xmlsc_to2 line 5.
Can't modify array dereference in substitution (s///) at ./xmlsc_to2 line 5, near "s/ü/\&\ü/g;"

Wie mache ich es am besten, dass ich den kompletten Inhalt einer Datei einlese und dann meine Veränderungen daran durchführe? Muss ich wirklich die Datei zeilenweise mit einer Schleife durcharbeiten?

Thx,
Florian
esskar
 2004-06-26 22:06
#83748 #83748
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Phobeus,26.06.2004, 19:53]Muss ich wirklich die Datei zeilenweise mit einer Schleife durcharbeiten?[/quote]
ja, musst du!
Strat
 2004-06-26 22:12
#83749 #83749
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#! /usr/bin/perl
use warnings;
use strict;

my $infile = $ARGV[0]; # 1. parameter auslesen
-f $infile or die "Error: '$infile' is not a file\n";

open (IN, $infile) or die "Error: couldn't read '$infile': $!\n";

while (<IN>) { # zeile fuer zeile einlesen => $_
$_ =~s/ü/&ü/g;
# .... usw.
print $_;
} # while
close (IN);
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Phobeus
 2004-06-26 22:19
#83750 #83750
User since
2004-06-26
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich bin fast schockiert, dass es dafür keine Kurzschreibweise gibt, die einen den Einsatz einer Schleife erspart ;) Danke für die schnelle Hilfe!
coax
 2004-06-26 22:49
#83751 #83751
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=Phobeus,26.06.2004, 20:19]Ich bin fast schockiert, dass es dafür keine Kurzschreibweise gibt, die einen den Einsatz einer Schleife erspart ;) Danke für die schnelle Hilfe![/quote]
Es ist schon moeglich die RegExp einmal auf die gesamte Datei anzuwenden, dabei wird aber auch die gesamte Datei in den Speicher geladen.

Code: (dl )
1
2
3
4
5
{
 local $/;
 my $file_content = <DATA>;
 $file_content =~ s/Text/Ersetzen/;
}

hier bei wird $/ auf undef (undefiniert) gesetzt, was bewirkt das von nun an die Datei in einen Stueck eingelesen wird. Die geschweiften Klammern bilden einen Block, der Block und das local sorgen dafuer, dass $/ nur innerhalb dieses Blocks auf undef gesetzt ist. Auszerhalb des Blocks besitzt $/ weiterhin ihren originalen Wert, der \n ist.

In etwa das gleiche Ergebnis laesst sich mit join erzeugen
Code: (dl )
my $file_content = join '', <DATA>;


Wenn du jedoch wie bei dir im Beispiel nur einzelne Buchstaben ersetzt ist die Verwendung der Schleife vorzuziehen, da der Speicher nicht so stark belastet wird.
Die ganze Datei muesste man zum Beispiel dann einlesen, wenn ein String der in mehrere Zeilen verteilt ist als Ganzes gebraucht wird.

Grusz Christian.\n\n

<!--EDIT|coax|1088276886-->
,,Das perlt aber heute wieder...'' -- Dittsche
Phobeus
 2004-06-26 23:08
#83752 #83752
User since
2004-06-26
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke auch noch einmal für deine Erklärung. Der Vorteil es in einer Schleife zu machen leuchtet wirklich ein. Zwar sind es meist eher kleinere Dateien, aber auch da muss man ja nicht mit dem Speicher rumsauen *g Habe übrigens nun alles auf die Skripte angewendet und es funktioniert hevorragend. Bin fast schockiert, wie lange ich gestern daran rumgedoktert habe. Herzlichen Dank an alle!
<< >> 6 Einträge, 1 Seite



View all threads created 2004-06-26 21:53.