Потрібне уточнення щодо правил сита…: містить із чи без alof / allof?


2

Нещодавно я почав вдосконалювати свої правила сит і став трохи не впевнений у тому, як :containsнасправді це працює. Я перевірив http://sieve.mozdev.org/reference.html, але все ще не з'ясував питання, яке було у мене.

Скажіть, у мене є таке правило:

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

чи означає це (і це було б моє уявлення про те, як я хочу, щоб воно працювало) автоматично, що будь-яке з перерахованих полів заголовка ["List-Id", "X-Mailinglist", "X-Mailing-List"]повинно містити будь-яке із заданих значень ["ros-dev.reactos.org", "ros-general.reactos.org"]або потрібно сказати прямо if anyof (...)так:

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

... для цього бажаного результату? Або ж ці два списки не відповідають кожному елементу першого по кожному елементу другого списку в будь-якому випадку ?

NB: Я знаю, що на умови, розділені комами, впливають anyofі allofвідповідно. Так if anyof (condition1, condition2)означає (псевдокод) if (condition1 or condition2)і if allof (condition1, condition2)означає if (condition1 and condition2). Розуміння цього аспекту - не моя проблема.

Однак я не розумію, чи впливає anyofі, allofвідповідно, один чи обидва списки у :containsпункті . У наведеному вище прикладі є список для заголовкових полів та список значень, які мають відповідати.


По суті питання зводиться до того, існує чи ні семантична різниця між двома наведеними вище фрагментами. А якщо ні, то чи означає це перший :

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

... або це:

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

... або щось інше взагалі.

Відповіді:


1

anyofозначає, що якщо будь-який окремий заголовок містить одне з альтернативних значень, то вся умова стає true, проте заголовки решти містять щось інше.

anyofТАКОЖ стає, trueколи всі заголовки містять заздалегідь задані значення. Це розслаблений стан.

allofТІЛЬКИ стає, trueколи всі заголовки містять заздалегідь задані значення. Це сувора умова.


дякую за ваш час, але це саме та частина, яку я вже зрозумів. Я не потребував уточнення для цієї частини. Однак я додав ще кілька речень у надії, що я можу пояснити, що я хочу.
0xC0000022L

0

Як зазначено у посиланні, яке ви вказали , а також у специфікації RFC 3028 для headerтесту,

Тест "заголовка" оцінюється як істинне, якщо будь-яке ім'я заголовка відповідає будь-якій клавіші.

Тобто, кожне ім'я заголовка порівнюється з кожним значенням, і якщо будь-який з перехресних продуктів є збігом, тест проходить. Зазначений компаратор ( :containsу вашому випадку) використовується для кожного окремого порівняння. В основному, ваше перше переписання в anyofце правильно.

Використання є anyofі allofколи є кілька тестів, які ви хочете використовувати, але іноді ви можете зібрати багато логіки в один "тест", як у вас тут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.