Разъяснение о необходимых правилах сита...: содержит с или без anyof/allof?

Недавно я начал совершенствовать свои правила сита и стал немного неуверенным в том, как :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;
}

... или что-то совсем другое.

2 ответа

anyof означает, что если любой отдельный заголовок содержит одно из альтернативных значений, тогда все условие становится trueТем не менее, остальные заголовки содержат что-то еще.

anyof ТАКЖЕ становится true когда все заголовки содержат предопределенные значения. Это расслабленное состояние.

allof ТОЛЬКО становится true когда все заголовки содержат предопределенные значения. Это строгое условие.

Как указано в справочной информации, указанной вами, а также в спецификации RFC 3028 для header тестовое задание,

Тест "header" оценивается как true, если какое-либо имя заголовка соответствует какому-либо ключу.

То есть каждое имя заголовка сравнивается с каждым значением, и, если какой-либо из перекрестных продуктов является совпадением, тогда тест проходит. Указанный компаратор (:contains в вашем случае) используется для каждого отдельного сравнения. По сути, ваш первый переписать в anyof верно.

Использование anyof а также allof это когда вы хотите использовать несколько тестов, но иногда вы можете собрать много логики в один "тест", как здесь.

Другие вопросы по тегам