PROCMAILSC(5) | File Formats Manual | PROCMAILSC(5) |
NUME¶
procmailsc - tehnică de punctare ponderată procmail
SINOPSIS¶
[*] w^x condiție
DESCRIERE¶
Pe lângă condițiile tradiționale de tip adevărat sau fals pe care le puteți specifica pentru o rețetă, puteți utiliza o tehnică de punctare ponderată pentru a decide dacă o anumită rețetă se potrivește sau nu. Atunci când se utilizează punctarea ponderată într-o rețetă, atunci punctajul final pentru acea rețetă trebuie să fie pozitiv pentru ca aceasta să se potrivească.
O anumită condiție poate contribui la punctaj dacă i se alocă o „pondere” (w) și un „exponent” (x). Acest lucru se face precedând condiția (pe aceeași linie) cu:
w^x
Condiții de expresie regulată ponderată¶
Prima dată când expresia regulată este găsită, se va adăuga w la punctaj. A doua oară când este găsită, se va adăuga w*x. A treia oară când este găsită, se va adăuga w*x*x. A patra oară se va adăuga w*x*x*x*x. Și așa mai departe.
Acest lucru poate fi descris prin următoarea formulă concisă:
n
n k-1 x - 1 w * Sum x = w * -------
k=1 x - 1
Reprezintă punctajul total adăugat pentru această condiție în cazul în care se găsesc n potriviri.
Rețineți că se pot face următoarele
distincții între cazuri:
- x=0
- Doar prima potrivire va contribui cu w la punctaj. Orice potriviri
ulterioare sunt ignorate.
- x=1
- Fiecare potrivire va contribui cu același w la scor. Punctajul
crește liniar cu numărul de potriviri găsite.
- 0<x<1
- Fiecare potrivire va contribui mai puțin la punctaj decât
cea precedentă. Punctajul se va apropia asimptotic de o
anumită valoare (a se vedea secțiunea NOTE de mai
jos).
- 1<x
- Fiecare potrivire va contribui mai mult la punctaj decât cea
precedentă. Punctajul va crește exponențial.
- x<0
- Poate fi utilizată pentru a favoriza un număr par sau impar de meciuri.
În cazul în care expresia regulată este
negată (adică se potrivește dacă nu este
găsită), atunci n poate fi, evident, fie zero, fie unu.
Condiții de program ponderate¶
Dacă programul returnează un cod de ieșire de EXIT_SUCCESS (=0), atunci scorul total adăugat va fi w. Dacă returnează orice alt cod de ieșire (care indică un eșec), punctajul total adăugat va fi x.
În cazul în care codul de ieșire al
programului este negat, atunci codul de ieșire va fi considerat ca
și cum ar fi un număr virtual de potriviri. Calcularea
punctajului adăugat se face ca și cum ar fi fost o expresie
regulată normală cu
n=„cod-de-ieșire” potriviri.
Condiții de lungime ponderată¶
Dacă lungimea corespondenței actuale este M, atunci:
* w^x > L
va genera un punctaj suplimentar de:
x
/ M \ w * | --- |
\ L /
Și:
* w^x < L
va genera un punctaj suplimentar de:
x
/ L \ w * | --- |
\ M /
În ambele cazuri, dacă L=M, acest lucru va
adăuga w la punctaj. Cu toate acestea, în primul caz, vor fi
favorizate mesajele mai mari, iar în cel de-al doilea caz vor fi
favorizate mesajele mai mici. Cu toate că x poate fi modificat pentru
a regla cu exactitate gradul de abatere al funcției, în mod
obișnuit, x este stabilit la 1.
DIVERSE¶
Puteți interoga punctajul final al tuturor condițiilor unei rețete din variabila de mediu $=. Această variabilă este definită întotdeauna imediat după ce procmail a analizat toate condițiile unei rețete (chiar dacă rețeta nu este în curs de execuție).
EXEMPLE¶
Următoarea rețetă va elimina toate mesajele care au mai mult de 150 de rânduri în corp. Prima condiție conține o expresie regulată goală care, deoarece se potrivește întotdeauna, este utilizată pentru a da punctajului nostru un decalaj negativ. A doua condiție se potrivește apoi cu fiecare linie din mesaj și consumă decalajul negativ anterior pe care l-am dat (un punct pe linie). În cele din urmă, punctajul va fi pozitiv numai dacă mesajul conține mai mult de 150 de linii.
:0 Bh * -150^0 * 1^1 ^.*$ /dev/null
Să presupunem că aveți un dosar prioritar pe care îl citiți întotdeauna primul. Următoarea rețetă selectează corespondența prioritară și o arhivează în acest dosar special. Prima condiție este una obișnuită, adică nu contribuie la punctaj, ci pur și simplu trebuie să fie îndeplinită. Celelalte condiții descriu lucruri precum: John și Claire au de obicei ceva important de spus, întâlnirile sunt de obicei importante, răspunsurile sunt puțin favorizate, mesajele despre Elvis (acesta este doar un exemplu : -) sunt favorizate (cu cât este mai mult menționat, cu atât mai mult este favorizat mesajul, dar punctajul maxim suplimentar datorat lui Elvis va fi de 4000, indiferent de cât de des este menționat), multe rânduri citate nu sunt apreciate, emoticoanele „smileys” sunt apreciate (punctajul pentru acestea va ajunge la un maxim de 3500), aceste trei persoane nu trimit de obicei mesaje interesante, mesajele trebuie să fie de preferință mici (de exemplu, mesajele cu o lungime de 2000 de octeți vor avea un punctaj de -100, cele cu o lungime de 4000 de octeți fac -800). După cum vedeți, dacă unele dintre persoanele neinteresante trimit mesaje, acestea au totuși o șansă de a ajunge în dosarul prioritar, de exemplu, dacă este vorba despre o întâlnire sau dacă conțin cel puțin două emoticoane.
:0 HB * !^Precedence:.*(junk|bulk) * 2000^0 ^From:.*(john@home|claire@work) * 2000^0 ^Subject:.*meeting * 300^0 ^Subject:.*Re: * 1000^.75 elvis|presley * -100^1 ^> * 350^.9 :-\) * -500^0 ^From:.*(boss|jane|henry)@work * -100^3 > 2000 dosar_prioritar
Dacă sunteți abonați la o listă de discuții și doriți doar să citiți mesajele de calitate, atunci următoarele rețete ar putea fi de folos. Mai întâi ne asigurăm că mesajul provine de la lista de discuții. Apoi verificăm dacă este de la anumite persoane a căror opinie o apreciem sau despre un subiect despre care vrem neapărat să știm totul. Dacă este așa, îl arhivăm. În caz contrar, verificăm dacă raportul dintre liniile citate și liniile originale este de cel mult 1:2. Dacă depășește această valoare, renunțați la mesaj. Tot ceea ce a supraviețuit testului anterior, este clasat.
:0 ^From mailinglist-request@some.where {
:0:
* ^(From:.*(paula|bill)|Subject:.*skiing)
mailinglist
:0 Bh
* 20^1 ^>
* -10^1 ^[^>]
/dev/null
:0:
mailinglist }
Pentru alte exemple, consultați pagina de manual
procmailex(5).
AVERTISMENTE¶
Deoarece acest lucru accelerează căutarea cu un
ordin de mărime, egrep-ul intern procmail va căuta
întotdeauna cea mai din stânga cea mai scurtă
potrivire, cu excepția cazului în care determină ce
să atribuie la MATCH, caz în care va căuta cea
mai din stânga cea mai lungă potrivire. De exemplu,
pentru cea mai din stânga potrivire cea mai scurtă, de
la sine, expresia regulată:
- .*
- se va potrivi întotdeauna cu un șir de lungime zero
în același loc.
- .+
- se va potrivi întotdeauna cu un singur caracter (cu excepția
liniilor noi, bineînțeles).
CONSULTAȚI ȘI¶
procmail(1), procmailrc(5), procmailex(5), sh(1), csh(1), egrep(1), grep(1),
ERORI¶
În cazul în care, într-o condiție de lungime, specificați un x care provoacă o depășire, procmail este la mila funcției pow(3) din biblioteca dvs. de matematică.
Numerele cu virgulă mobilă în format
„ingineresc” (de exemplu, 12e5) nu sunt acceptate.
DIVERSE¶
De îndată ce se atinge „plus infinit” (2147483647), toate condițiile ponderate ulterioare vor fi pur și simplu ignorate.
De îndată ce se atinge "minus infinit"
(-2147483647), condiția va fi considerată ca fiind
„fără corespondență” și
rețeta se va încheia mai devreme.
NOTE¶
Dacă într-o expresie regulată formula ponderată 0<x<1, punctajul total adăugat pentru această condiție se va apropia asimptotic:
w -------
1 - x
Pentru a ajunge la jumătate din valoarea maximă, aveți nevoie de
- ln 2 n = --------
ln x
potriviri.
AUTORI¶
Stephen R. van den Berg
<srb@cuci.nl>
TRADUCERE¶
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
BuGless |