SkÃ¥ne Sjælland Linux User Group - http://www.sslug.dk Forside   Tilmelding   Postarkiv   Forum   Kalender   Søg
MhonArc Dato: [Date Prev] [Kronologisk oversigt] [Date Next]   TrÃ¥d: [Date Prev] [Oversigt trÃ¥de] [Date Next]   MhonArc
 

Re: [PERL] escape en sti i en one-liner



On Sat, 2 Nov 2002, Ole Tange wrote:

> > I bash har jeg lavet følgende
> >
> > ..........
> > for LINE in `cat sletstier`; do
> >   perl -ni -e "print unless /`echo ${LINE} | sed 's#/#\\\/#g'`/" stier
> >   perl -ni -e "print unless /`echo ${LINE} | sed 's#/#\\\/#g'`/" sletstier
> > done
>
> Jeg tror, du skal give os to korte eksempler på, hvad stier og sletstier
> kunne indeholde.

Okay... Filerne indeholder reelt md5summer og filnavne (relative), og er
altså lister af md5summer og filnavne. For at forsimple det til mit
problem med "/" undlod jeg at nævne md5summerne

Noget lig følgende:

stier:
------
<md5sum>:home/bjoern/test/1/test1.txt
<md5sum>:home/bjoern/test/1/test2.txt
<md5sum>:home/bjoern/test/2/test1.txt
<md5sum>:home/bjoern/test/2/test2.txt

sletstier:
----------
<md5sum>:home/bjoern/test/1/test2.txt


Når man kører scriptet vil "<md5sum>:home/bjoern/test/1/test2.txt" blive
fjernet fra stier og sletstier, hvorefter sletstier er tom og stier har 3
linjer tilbage.


> Mit gæt på løsning er:
>
> perl -ne 'BEGIN{chomp(@a=`cat /tmp/sletstier`);$"="|"} /@a/o or print'
> stier
>
> eller
>
> perl -e 'chomp(@a=`cat /tmp/sletstier`);$"="|"; print grep !/@a/o, <>'
> stier
>
> $" er det, som bliver sat mellem elementerne i @a, når @a står som "@a"
> eller /@a/. /o = compile-once.

Begge løsninger fungerer, og på en mere fornuftig måde end min for
løkke. Vi kom samtidig betydelig dybere ned i perl end jeg tidligere har
været.

Jeg er stadig ikke helt sikker på at jeg helt har forstået hvordan
;$"="|"; virker, men...

Hvis jeg har forstået det rigtigt, så bliver hele filen lavet om til et
"<sti>|<sti>|<sti>" udtryk, som så bliver brugt til at fravælge det der
ikke skal udskrives.

Er det rigtigt forstået at grunden til at det virker er at det er "|" der
nu er seperator i stedet for "\n", og det hele derfor virker som et
"eller" udtryk i matchningen?

Hvordan har perl det med sådanne udtryk der har MANGE (tusinder)
eksklusioner? Det kan jo gå hen og blive et temmelig stort array.


Med venlig hilsen
Bjørn Bille Højte
sslug@sslug




 
Forside   Tilmelding   Postarkiv   Oversigt   Kalender   Søg

 
 
Henvendelse vedrørende websiderne til <www_admin>. Senest ændret 2005-08-10, klokken 19:55
Denne side vedligeholdes af MHonArc .