|
|||||||||||||||||||||||||||
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
|
||||||||||||||
|
||||||||||||||