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
Уточните вопрос? Возможно, более полный пример того, что вы пробовали, что происходит, когда вы запускаете его, и что вы хотите вместо этого? – IMSoP
Ничего. Я получил ответ. –
Было бы лучше, если бы вы определили «первую» и «вторую» части вместе с кодом, который вы пробовали. Если у вас есть собственный ответ, это нормально, но, пожалуйста, предоставьте его. – JonB