Provided by:
manpages-hu_20010119-5_all 
NÉV
procmailsc - a procmail súlyozott pontozási módszere
ÁTTEKINTÉS
[*] w^x feltétel
LEÍRÁS
A szűrési feltételekben megadott hagyományos igaz/hamis vizsgálat
mellett a súlyozott pontozási módszert is lehet használni a feltételek
helyességének megállapítására. A szűrési feltételben használt pontozási
módszereknél a pozitív értékek az igaz állításnak felelnek meg.
A feltételek az alábbi módon kapnak pontokat, `fontosság' (w) és
`kitevő' (x). A feltétel előtt (ugyanabban a sorban) lehet megadni ezt
a következőképen:
w^x
Ahol, mind w és x pozitív valós számok -2147483647.0 és 2147483647.0
között.
Súlyozás egyszerű feltételnél
A feltétlenek való első megfeleléskor w -vel nő a pontszám. A következő
megfeleléskor már w*x -el. Harmadik találat esetén w*x*x -el. Negyedik
megfeleléskor w*x*x*x -el. És így tovább.
Ezt a következő képlettel lehet kifejezni:
n
n k-1 x - 1
w * Sum x = w * -------
k=1 x - 1
A képlet megadja a feltétel n számú megfelelésekor az összpontszámot.
A következő eseteket lehet x -től függően megkülönböztetni:
x=0 Csak az első találat esetén növekszik a pontszám w-vel. Minden
más találat figyelmen kívül lesz hagyva.
x=1 Minden egyes találat w-vel növeli a pontszámot. Az összpontszám
a találatok számával egyenes arányban növekszik.
0<x<1 Minden újabb találattal kevesebb pontot adunk az
összpontszámhoz, mint előtte. Ekkor az összpontszám egyoldalról
(aszimptotikusan) közelít egy határértékhez. (Lásd MEGJEGYZÉS
részt később).
1<x Minden újabb találattal egyre több pontot adunk az összeghez,
mint előtte. Az összpontszám exponenciálisan növekszik.
x<0 Segítségével megkülönböztethetjük az egész- vagy páratlan számú
találatokat.
Ha a feltételnek való megfelelést megfordítjuk [negáljuk] (pl. találat,
ha nincs egyezés a feltétellel), akkor az n értéke természetesen nulla
vagy egy lehet.
Súlyozott kilépésiértékek
Ha a program EXIT_SUCCESS (=0) -vel fejezi be működését, akkor az
összpontszám w lesz. Bármely más kilépési kód (hibás működés) esetén
az összpontszám x lesz.
A program kilépési kódjának megfordításakor (negálásakor) kapott
pontszámot a lehetséges találatok számával ('virtual number of
matches') azonosítja a program. Az összpontszám kiszámítása ugyanúgy
történik, mint ahogy hagyományos kifejezéssel való egyezéskor történne,
vagyis mintha n=`exitcode' számú találat lett volna.
Súlyozás levélméret alapján
Ha a levél mérete M akkor:
* w^x > L
esetén a megfelelő pontszám a következőképen számolható:
x
/ M \
w * | --- |
\ L /
És:
* w^x < L
esetén a pontszám a következőként adódik:
x
/ L \
w * | --- |
\ M /
Mindkét esetben, ha L=M, akkor az összpontszámhoz csupán w adódik. Az
előző példa azonban hosszabb levelekre, míg az utóbbi a rövidebb
levelekre használandó. Az x változtatásával a függvény pontosságát
lehet 'finomhangolni', de az x=1 többnyire megfelelő.
EGYÉB
A szűrési feltételben (recipe) szereplő összes pontszámot a $=
környezeti változó segítségével lehet kiolvasni. Ezt a változó minden
szűrés után ellenőrzésre kerül (még ha a szűrés nem is hajtódik végre).
PÉLDÁK
A következő példával minden a olyan levelet töröltethetünk, amely a
törzsében 150 sornál többet tartalmaz. Az első sorban egy üres
feltétel talalható, amely minden levélre igaz, ezzel a pontszámnak egy
kezdeti (negatív) értéket adtunk meg. A következő feltétel
segítségével minden egyes új sor esetén növeltetjük az összpontszámot
(soronként egy ponttal). A feltétel pozitív pontszámmal zárul, ha a
levél 150 sornál többet tartalmazott.
:0 Bh
* -150^0
* 1^1 ^.*$
/dev/null
Ha van egy külön levelesmappánk, amelyet mindig először olvasunk el,
akkor a következő szűrési feltétellel a fontosabb leveleket
átirányíthatjuk ebbe a mappába. Az első feltétel nem használ pontozást,
mindössze figyeli, hogy a levelek nem tartalmazzák-e a megadott
feltételeket. A következő feltételek pedig a következőt fejezik ki:
józsi és kati általában hasznos dolgokról írnak; a megbeszélésekről
szóló levelek fontosak a számunkra; válaszleveleket is szívesen
olvasunk; Elvis-ről szóló leveleket (hátha megtudunk valami újat)
mindig elolvassuk (minél többször említik a levélben Elvist, annál több
pontot kap a levél, de maximum 4000 pontot); túl sok idézett sort
tartalmazó levelet el szeretnénk kerülni; ha smiley-t küldenek nekünk,
akkor azt szívesen megnézzük (erre maximum 3500 pontot adunk); három
embertől (főnők, timi, péter) általában unalmas leveleket szoktunk
kapni; és végül nem szeretjük a hosszú leveleket, jobb, ha a levél csak
2000 bájt hosszú, ha ennél hosszabb, akkor 100 pontot, ha 4000 bájtnál
hosszabb akkor pedig 800 pontot vonunk le az összes pontszámából. A
pontozási módszer segítségével azonban, még ha egy unalmas levelet is
kapunk három emberünk valamelyikétől a levél még bekerülhet a külön
mappánkba, ha pl. megbeszélésről szól, vagy tartalmaz legalább 2 darab
smileyt.
:0 HB
* !^Precedence:.*(junk|bulk)
* 2000^0 ^From:.*(jozsi@otthon|kati@munkahely)
* 2000^0 ^Subject:.*megbeszeles
* 300^0 ^Subject:.*Re:
* 1000^.75 elvis|presley
* -100^1 ^>
* 350^.9 :-\)
* -500^0 ^From:.*(fonok|timi|peter)@munkahely
* -100^3 > 2000
kulon_mappa
Ha a levelezőlistákról érkező levelek közül csak a hasznos leveleket
szeretnénk elolvasni, akkor a következő szűrési feltételt
használhatjuk. Az első feltétel ellenőrzi, hogy a levél a megadott
levelezőlistáról jött-e. Aztán a leveleket ellenőrizzük, hogy olyan
személytől jött-e akinek adunk a szavára, vagy olyan témáról szól,
amelyről mindent El szeretnénk olvasni. Ha ezeknek megfelel, akkor
marad a levél. A többi levélnél megvizsgáljuk, hogy az idézett és az
új sorok aránya eléri-e az 1:2-hözt. Ha ennél több, akkor töröljük a
levelet. Minden olyan levél, amely átment az előző vizsgálaton mentésre
kerül.
:0
^From levelezőlista@vhol
{
:0:
* ^(From:.*(piroska|bandi)|Subject:.*sieles)
levlista
:0 Bh
* 20^1 ^>
* -10^1 ^[^>]
/dev/null
:0:
levlista
}
További mintapéldák a procmailex(5) súgóban lehet találni.
FIGYELMEZTETÉS
A procmail a gyors keresés érdekében mindig csak a balelső (leftmost)
legrvidebb egyezésig keres, ha csak nem a MATCH -be értéket kell
átadni, ebben az esetben a balelso leghosszabb találatig keres. Pl. A
balelső legrvidebb találat a következő kifejezésre:
.* mindig nullahosszúságú találatot eredményez.
.+ pedig mindig csak egy karaktert (sortörést persze nem)
eredményez.
LÁSD MÉG
procmail(1), procmailrc(5), procmailex(5), sh(1), csh(1), egrep(1),
grep(1),
HIBÁK
Ha az x értéke túlcsorduláshoz vezet, akkor a matematikai
függvénytárban lévő pow(3) függvénytől függ a végső eredmény.
Lebegő pontos számok mérnöki formátumban (pl. 12e5) nem adhatók meg.
EGYÉB
A `pozitív végtelen' (2147483647) elérésekor minden tovbbi súlyozás át
lesz ugorva.
A `negatív végtelen' (-2147483647) elérésekor a szűrés megfelelés
hiányában befejeződik.
MEGJEGYZÉS
0<x<1 esetén a hagyományos feltétel pontszáma a következő számhoz
közelít egyoldalról:
w
-------
1 - x
A maximális érték felének eléréséhez
- ln 2
n = --------
ln x
számú találatra van szükség.
SZERZŐ
Stephen R. van den Berg
<srb@cuci.nl>
MAGYAR
Vizi Szilárd <vizisz@freemail.hu>