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) условие1 или условие2) и if allof (condition1, condition2) условие1, условие2) означает if (условие1 и условие2 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 ответа2

1

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

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

allof только становится true , когда все заголовки содержат предопределенные значения. Это строгое условие.

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .