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

429
0xC0000022L

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

2 ответа на вопрос

1
Kondybas

anyof means that if any single header contains one of the alternative values, then the whole condition become true, nevertheless the rest headers contains something else.

anyof ALSO becomes true when all the headers contains the predefined values. This is the relaxed condition.

allof ONLY becomes true when all the headers contains the predefined values. This is the strict condition.

спасибо за ваше время, но это именно та часть, которую я уже понял. Я не нуждался в разъяснениях для этой части. Однако я добавил еще несколько предложений в надежде, что смогу объяснить, что мне нужно. 0xC0000022L 8 лет назад 0
0
Peter Cooper Jr.

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

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

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

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

Похожие вопросы