linux-l: nochmal Perl

Jens Dreger jens.dreger at physik.fu-berlin.de
Fr Jan 19 01:21:48 CET 2001


On Thu, Jan 18, 2001 at 01:24:05PM +0100, Ulrich Wiederhold wrote:
> Hallo,
> nochmal perl...ich will das jetzt ausbauen und komme beim Speichern der
> Datei nicht weiter.
> Bisher: 1. Zeile soll entfern werden:
> ...
  $string =~ s/_/ /g;
> foreach $location (@locations)
>    {
>    	open(TOGET, "<$location");
> 	open(DEL, ">$location.new");
> 	while(<TOGET>)
> 	  {

>   	    next unless($.-1);
ersetzen durch:
	    if($.==1) { s/_/ /g; next if(/\Q$string/); }

>     	    print DEL;
>     	  }
>   	close(TOGET);
> 	close(DEL);
> 	rename "$location.new",	"$location";
> 	$i++;
>    }
> ...
> 
> Problem ist jetzt, daß ich nochmal überprüfen will (muß), ob die erste
> Zeile auch korrekt ist, also ob sie auch den String $string enthält.
> Außerdem kann string entweder mit " " zwischen den Wörtern oder mit "_"
> zischen den Wörtern daherkommen... (taps taps), muß also beides getestet
> werden...
> 
> Also sowas in der Art
> if($zeile =~ /\Q$s t r i n g/i oder $zeile =~ /\Q$s_t_r_i_n_g/i){ do
> delete} else {next}
> 
> bzw.
> 
> next unless(!($ enthält $s t r i n g oder $s_t_r_i_n_g)
> 
> 
> So, nun wieder ein Beispiel (für Jens! :))) ):
> 
> Angenommen...
> 
> $string = "Dies ist ein String" oder $string = "Dies_ist_ein_String"

Na, die Beispiele haette ich mir auch noch zusammenreimen
koennen. Interessanter ist doch die Frage, was passiert, wenn Du auf
sowas triffst:

      'Dies_ist ein_String_und der enthaelt auch_noch_sowas $[blah]\[blub]'

Obige Loesung behandelt einfach '_' und ' ' identisch, kommt also
klar, wenn sowohl '_' als auch ' ' im Pattern und im durchsuchten
String vorkommen.

> P.S.: Ach ja, Jens... schaffst Du das in einer Zeile!?

Du hast ja nicht gesagt, woher der $string kommen soll. Aber wenn der
schon in $s gespeichert waere, ginge wohl sowas hier:

      perl -pe 'BEGIN{$_=<>;$s=~s/ /_/g;s/ /_/g;/\Q$s/||print;}'

----8<---abcd.txt--
a b_c
a
b
c
d
-----------------

~> perl -pe 'BEGIN{$s="a b c";$_=<>;$s=~s/ /_/g;s/ /_/g;/\Q$s/||print;}' abcd.txt
a
b
c
d

Gruss,

Jens.



Mehr Informationen über die Mailingliste linux-l