#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)
в свой сценарий.