Возможно ли иметь оператор » или » или «и» внутри сравнения «eq» или «ne» в perl?

#perl #compare #operators

Вопрос:

Можно ли сократить этот сценарий:

 use strict;
use warnings;

my $tests = [-1,0,1,2,];

foreach my $test (@$tests){
    if ($test ne 0 and $test ne -1){ # THIS LINE
       print "$test - Successn";
    }else{
       print "$test - Errorn";
    }
}
 

Выход:

 -1 - Error
0 - Error
1 - Success
2 - Success
 

В нечто подобное этому, где вы можете поместить набор условий в состояние сравнения (я знаю, что этот код не работает, это пример аналогичного синтаксиса, который я ищу):

 use strict;
use warnings;

my $tests = [-1,0,1,2,];

foreach my $test (@$tests){
    if ($test ne (-1 or 0) ){ # THIS LINE
       print "$test - Successn";
    }else{
       print "$test - Errorn";
    }
}
 

Вариант использования был бы примерно таким

 foreach my $i (0..$variable){
    test 1
    if ($test->{a}->{$variable}->{b} ne 1 and $test->{a}->{$variable}->{b} ne 0){
        ...
    }
    # test 2
    if ($test->{a}->{$variable}->{c} ne 3 and $test->{a}->{$variable}->{c} ne 4){
        ...
    }
}
 

Такой синтаксис значительно упростил бы написание тестов такого типа без необходимости создавать новые переменные, чтобы код было легко читать.

Комментарии:

1.Технически $test ne 0 это неверно, потому что он выполняет строковое сравнение с числом. То, что вы делаете, будет работать по назначению, если вы хотите исключить точную строку "0" из сопоставления. Он вернет значение true для других ложных значений, таких как пустая строка, неопределенная 0 (ноль с пробелом) и т. Д. Если вы действительно хотите выполнить числовое сопоставление, вам следует использовать оператор != .

Ответ №1:

Я бы использовал List::Util::any или List::Util::all :

 if (any { $test != $_ } 0, 1) { ... }
if (all { $test != $_ } 0, 1) { ... }
 

похоже на

 if ($test != 0 || $test != 1) { ... }
if ($test != 0 amp;amp; $test != 1) { ... }
 

Обратите внимание, что List::Util это основной модуль, а это значит, что вам не нужно ничего устанавливать, чтобы это работало. Просто добавьте use List::Util qw(any all) в свой сценарий.