PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 42


дет — приходится выполнять неуклюжие проверки с defined. Часто бывает удоб­но организовать программу так, чтобы принималась в расчет истинность или ложность переменных, а не их определенность.

В отличие от других языков, где возвращаемые значения ограничиваются О и 1, оператор | | Perl обладает более интересным свойством: он возвращает первый (левый) операнд, если тот имеет истинное значение; в противном случае возвраща­ется второй операнд. Оператор && ведет себя аналогично (для второго выражения), но этот факт используется реже. Для операторов несущественно, что представля­ют собой их операнды — строки, числа или ссылки; подойдет любое скалярное значение. Они просто возвращают первый операнд, из-за которого все выражение становится истинным или ложным. Возможно, это расходится с возвращаемым зна­чением в смысле булевой алгебры, но такими операторами удобнее пользоваться.

Это позволяет установить значение по умолчанию для переменной, функции или более длинного выражения в том случае, если первый операнд не подходит. Ниже приведен пример использования 11, в котором $foo присваивается либо $bar, либо, если значение $Ьаг ложно, — строка "DEFAULT VALUE":

$foo = $bar   ||     DEFAULT VALUE'

В другом примере переменной $di г присваивается либо первый аргумент команд­ной строки программы, либо ' /tmp", если аргумент не указан:

$dir = shift(@ARGV)   ||

To же самое можно сделать и без изменения @ARGV:

$dir = $ARGV[O]   ||   Vtmp"

Если 0 является допустимым значением $ARGV[O], использовать 11 нельзя, по­тому что вполне нормальное значение будет интерпретировано как ложное. При­ходится обращаться к тернарному оператору выбора:

$dir = defmed($ARGV[O])  ?  shift(@ARGV)       Vtmp ,

To же можно записать и иначе, со слегка измененной семантикой:

$dir = (3ARGV ?  $ARGV[O]        /tmp"

Мы проверяем количество элементов в @ARGV. В условии оператора выбора (9 ¦) @ARGV интерпретируется в скалярном контексте. Значение будет ложным лишь при нулевом количестве элементов, в этом случае будет использоваться "/tmp". Во всех остальных ситуациях переменной (когда пользователь вводит аргумент) будет присвоен первый аргумент командной строки.




Начало  Назад  Вперед