Разные операции
Операция запятая
Бинарная операция запятая, ведет себя по-разному в скалярном и списковом контексте.
В списковом контексте она является всего лишь разделителем между элементами списка:
@а = (1, 2); # Создается массив скаляров # и его элементам присваиваются значения 1 и 2.
В скалярном контексте эта операция полностью соответствует аналогичной операции языка С: вычисляется левый операнд, затем правый операнд, вычисленное значение которого и является возвращаемым значением этой операции. Если в предыдущем примере заменить массив @ аскалярной переменной $ а, то ей будет присвоено значение 2:
$а = (1, 2); # Переменной $а присваивается значение 2.
Замечание
Надеемся, читателю теперь стало ясно, почему конструкторы массивов, о которых мы рассказывали в гл. 3, в скалярном и в списковом контексте ведут себя по-разному.
Для операции запятая в языке Perl существует удобный синоним – операция ›, которая полностью идентична операции запятая и удобна при задании каких-либо величин, которые появляются парами, например, ключ/значение в ассоциированных массивах. Правда, эта операция обладает еще одним свойством, достаточно удобным для ее использования при задании ассоциированных массивов: любой идентификатор, используемый в качестве ее левого операнда, интерпретируется как строка.
Операция выбора
Единственная тернарная операция выбора:
операнд?! операнд2: операнд3
…полностью заимствована из языка С и работает точно так же, как и ее двойник. Если операнд! истинен, то возвращается значение операнд2, в противном случае операнда:
($n = 1)? $а: Sarray;
Скалярный или списковый контекст, в котором используется эта операция, распространяется и на возвращаемое значение этой операции:
$а = $yes? $b: @b; tt Скалярный контекст. Если возвращается # массив @b, то присваивается количество его t элементов.
Операцию выбора можно использовать в качестве левого операнда операции присваивания, если и второй, и третий ее операнды являются правильными lvalue, т. е. такими значениями, которым можно присвоить какое-либо значение, например, именами переменных:
($а = $yes? $b: @b) = @с;
В связи с тем, что результатом операции выбора может оказаться правильное lvalue, следует использовать скобки для уточнения ее операндов. Например, если в следующем выражении:
($а % 3)? ($а += 2): ($а -= 2);
…опустить скобки вокруг операндов:
$а % 3? $а += 2: $а -= 2;
…то оно будет откомпилировано следующим образом:
(($а % 3)? ($а += 2): $а).-= 2;