linux-l: sed/perl/wasauchimmer...

Jens Dreger jens.dreger at physik.fu-berlin.de
Do Sep 21 23:03:14 CEST 2000


On Thu, Sep 21, 2000 at 01:13:13PM +0200, ruwen poljak wrote:
> 
> >~wort durch <i>wort</i> ersetzen. Kann mir da mal jemand ein
> >geeigneten Codeschnipsel vorwerfen, den ich dann verfeinern kann?
> [...]
> 
> bsp perl (kein einzeiler):

Sorry, aber da _muss_ ich einfach was zu loswerden. Ich kann doch
unmoeglich zulassen, dass hier der Eindruck entsteht, Perl sei
ineffizient ;-)

Also gleich vorweg mal den ueblichen Perl-Einzeiler:

     perl -pe 's|~(\w+)|<i>$1</i>|g' test1.txt > test1-fixed.txt

oder gleich "in-place":

     perl -pi -e 's|~(\w+)|<i>$1</i>|g' test1.txt

> #!/usr/bin/perl
> 
> my $datei ="der pfad zur datei";
> my (@back, @wert) = "";
> 
> # einlesen 
> open (IN, $datei) || die "can not open:$!\n";
> 	while (<IN>) {	push(@back,$_) } 
> close IN;

Geht auch als 
     @back = <IN>; 

> # bearbeiten
> foreach (@back) {
> 	$_ =~ s/(\w+)/<i>$1</i>/;
>            push(@wert,$_);
>        } 

Abspeichern in @wert ist unnoetig, weil das $_ =~ ... Konstrukt die
Eintraege von @back modifiziert. Nach dieser Schleife sind @back und
@wert identisch. Man kann auch "map { s|(\w+)|<i>$1</i>|; } @back;"
nehmen, wenn man den @back soweiso in einem Stueck eingelesen hat.

> # schreiben
> open (IN, >$datei-neu) || die "can not open:$!\n";
> 	foreach (@wert) { print $_ };
> close IN;

print OUT @wert; 

> hoffe das klappt, habs nicht getestet.

Nein, klappt nicht ;-) Z.B. kannst Du eine Variable nicht $datei-neu
nennen oder Du musst '/' in s///-Konstrukten mit \ quoten. Ich
persoenlich finde es immer nicht schlecht, ein Beispiel vorher mal
kurz laufen zu lassen, weil man doch davon ausgehen muss, dass man
selbst die Fehler doch schneller findet als die anderen
Listeteilnehmer.

Gruss,

Jens.



Mehr Informationen über die Mailingliste linux-l