2014-11-29 2 views
0

Я использую приведенный ниже код. Справа от and находится grep без численного сравнения. Имеет ли это смысл?Результат grep as boolean

if (scalar(grep { $_ eq $ServerTypeId } keys %ServerTypes) > 0 
    and grep { isRegionOK($_, $DC) == 1 } keys %$destinationSummary) 
{ 
    ... 
} 
+0

Уточните вопрос? Возможно, более полный пример того, что вы пробовали, что происходит, когда вы запускаете его, и что вы хотите вместо этого? – IMSoP

+0

Ничего. Я получил ответ. –

+0

Было бы лучше, если бы вы определили «первую» и «вторую» части вместе с кодом, который вы пробовали. Если у вас есть собственный ответ, это нормально, но, пожалуйста, предоставьте его. – JonB

ответ

3

Perl, как и C, не имеет булева типа. Язык определяет определенные значения как ложные, а остальные - истины. См. How do I use boolean variables in Perl?, Truth and Falsehood.

В скалярном контексте grep возвращает количество совпадений. 0 является ложным, а все остальные числа истинны, поэтому обработка результата grep в виде булевских проверок, если были какие-либо совпадения. Так что да, grep вполне может быть использован в качестве аргумента and.


Давайте сделаем некоторую очистку.

Вы следующее:

scalar(grep { $_ eq $ServerTypeId } keys %ServerTypes) > 0 
and 
grep { isRegionOK($_, $DC) == 1 } keys %$destinationSummary 

Проверяется неотрицательное число больше нуля, то же самое, как проверка, если это правда или ложь.

scalar(grep { $_ eq $ServerTypeId } keys %ServerTypes) 
and 
grep { isRegionOK($_, $DC) == 1 } keys %$destinationSummary) 

and> до этого) оценивает свои аргументы в скалярном контексте, поэтому нет необходимости в scalar.

grep { $_ eq $ServerTypeId } keys %ServerTypes 
and 
grep { isRegionOK($_, $DC) == 1 } keys %$destinationSummary 

isRegionOK регион, безусловно, возвращает логическое значение.

grep { $_ eq $ServerTypeId } keys %ServerTypes 
and 
grep { isRegionOK($_, $DC) } keys %$destinationSummary 

exists является гораздо более эффективным при проверке существования хэш-элемента по ключу.

exists($ServerTypes{$ServerTypeId}) 
and 
grep { isRegionOK($_, $DC) } keys %$destinationSummary 
+0

Спасибо, что прояснил многое. –

+0

У меня все еще есть один вопрос. IsRegionOK возвращает 0 и 1.Но не grep возвращает 1 для обоих этих значений? –

+0

В скалярном контексте grep возвращает количество совпадений (аргументы, для которых блок возвращал true). – ikegami

Смежные вопросы