Esclarecimento sobre as regras de peneira necessárias…: contém com ou sem anyof / allof?

2

Comecei a refinar minhas regras de peneira recentemente e fiquei um pouco inseguro sobre como :contains realmente funciona. Eu verifiquei o link mas ele ainda não esclareceu a questão que eu tinha.

Digamos que eu tenha a seguinte regra:

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

isso significa (e que seria minha ideia de como eu quero que ele funcione) automaticamente qualquer um dos campos de cabeçalho listados ["List-Id", "X-Mailinglist", "X-Mailing-List"] deve conter qualquer um dos valores dados ["ros-dev.reactos.org", "ros-general.reactos.org"] ou preciso dizer explicitamente if anyof (...) assim:

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

... para este resultado desejado? Ou as duas listas não correspondem a cada elemento do primeiro em relação a cada elemento da segunda lista mesmo assim ?

NB: sei que as condições separadas por vírgula são afetadas por anyof e allof , respectivamente. Então if anyof (condition1, condition2) significa (pseudo-código) if (condition1 or condition2) e if allof (condition1, condition2) significa if (condition1 and condition2) . Entender este aspecto não é meu problema.

O que eu não consigo entender, no entanto, é se anyof e allof influenciam respectivamente um ou ambos das listas em uma cláusula :contains . No exemplo acima, há uma lista para os campos de cabeçalho e uma lista de valores a serem comparados.

Essencialmente, a questão se resume a haver ou não uma diferença semântica entre os dois trechos acima. E se não, então se o primeiro significa isso:

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

... ou isto:

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

... ou algo completamente diferente.

    
por 0xC0000022L 20.06.2015 / 15:09

2 respostas

1

anyof significa que, se qualquer cabeçalho individual contiver um dos valores alternativos, toda a condição se tornará true , mas os demais cabeçalhos conterão outra coisa.

anyof ALSO torna-se true quando todos os cabeçalhos contiverem os valores predefinidos. Essa é a condição relaxada.

allof SOMENTE se torna true quando todos os cabeçalhos contiverem os valores predefinidos. Esta é a condição estrita.

    
por 20.06.2015 / 15:51
0

Como referência que você indicou , além do especificação do RFC 3028 diz para o teste header

The "header" test evaluates to true if any header name matches any key.

Ou seja, cada nome de cabeçalho é comparado a cada valor e, se algum dos produtos cruzados for uma correspondência, o teste será aprovado. O comparador especificado ( :contains no seu caso) é usado para cada comparação individual. Basicamente, sua primeira reescrita em anyof está correta.

O uso de anyof e allof é quando há vários testes que você deseja usar, mas às vezes você pode incluir muita lógica em um "teste", como você tem aqui.

    
por 05.07.2017 / 22:23