Klärung über benötigte Siebregeln ...: enthält mit oder ohne etwas von / alles?

470
0xC0000022L

Ich habe vor kurzem angefangen, meine Siebregeln zu verfeinern, und bin unsicher geworden, wie das :containseigentlich funktioniert. Ich habe http://sieve.mozdev.org/reference.html ausgecheckt, aber meine Frage wurde dadurch nicht geklärt.

Angenommen, ich habe folgende Regel:

if header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] [ "ros-dev.reactos.org", "ros-general.reactos.org" ] { fileinto "Lists/ReactOS"; stop; } 

bedeutet das (und das wäre meine Vorstellung davon, wie ich will es arbeiten) automatisch, dass jeder der aufgeführten Header - Felder ["List-Id", "X-Mailinglist", "X-Mailing-List"]enthalten sollten alle die angegebenen Werte ["ros-dev.reactos.org", "ros-general.reactos.org"]oder muss ich sagen explizit if anyof (...)wie folgt ?:

if anyof ( header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] [ "ros-dev.reactos.org", "ros-general.reactos.org" ] ) { fileinto "Lists/ReactOS"; stop; } 

... für dieses gewünschte Ergebnis? Oder stimmen die beiden Listen ohnehin nicht mit jedem Element der ersten mit jedem Element der zweiten Liste überein ?

NB: Ich weiß, dass die durch Kommata getrennte Bedingungen betroffen sind anyofund allofjeweils. Also if anyof (condition1, condition2)Mittel (Pseudo-Code) if (condition1 or condition2)und if allof (condition1, condition2)Mittel if (condition1 and condition2). Diesen Aspekt zu verstehen ist nicht mein Problem.

Was ich nicht verstehen, ist jedoch, ob anyofund allofjeweils Einfluss eines oder beide der Listen in einer :containsKlausel . Im obigen Beispiel gibt es eine Liste für die Kopfzeilenfelder und eine Liste von Werten, mit denen verglichen werden soll.


Im Wesentlichen stellt sich die Frage, ob es einen semantischen Unterschied zwischen den beiden obigen Ausschnitten gibt oder nicht. Und wenn nicht, dann, ob der erste Folgendes bedeutet :

if anyof ( header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] "ros-dev.reactos.org", header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] "ros-general.reactos.org" ) { fileinto "Lists/ReactOS"; stop; } 

... oder dieses:

if allof ( header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] "ros-dev.reactos.org", header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] "ros-general.reactos.org" ) { fileinto "Lists/ReactOS"; stop; } 

... oder etwas anderes.

2

2 Antworten auf die Frage

1
Kondybas

anyofbedeutet, dass, wenn ein einzelner Header einen der alternativen Werte enthält, die gesamte Bedingung gilt true, der Rest-Header jedoch etwas anderes enthält.

anyofALSO wird, truewenn alle Header die vordefinierten Werte enthalten. Dies ist der entspannte Zustand.

allofNUR wird, truewenn alle Header die vordefinierten Werte enthalten. Dies ist die strikte Bedingung.

danke für deine zeit, aber das ist genau der teil, den ich schon verstanden habe. Ich brauchte keine Erklärung für diesen Teil. Ich habe jedoch noch ein paar weitere Sätze hinzugefügt, in der Hoffnung, dass ich erklären kann, wonach ich strebe. 0xC0000022L vor 8 Jahren 0
0
Peter Cooper Jr.

Wie die von Ihnen angegebene Referenz sowie die RFC 3028-Spezifikation für den headerTest angibt ,

Der Test "Header" wird als "true" ausgewertet, wenn ein Headername mit einem Schlüssel übereinstimmt.

Das heißt, jeder Header-Name wird mit jedem Wert verglichen. Wenn eines der Cross-Produkte eine Übereinstimmung darstellt, wird der Test bestanden. Der ( :containsin Ihrem Fall) angegebene Vergleicher wird für jeden einzelnen Vergleich verwendet. Grundsätzlich ist Ihre erste Neuschreibung anyofkorrekt.

Die Verwendung von anyofund allofist, wenn Sie mehrere Tests verwenden möchten, aber manchmal können Sie eine Menge Logik in einen "Test" packen, wie Sie es hier haben.