Оператор //

В предыдущем разделе мы показали, как присваивать значение по умолчанию при помощи оператора ||. Но при этом игнорировался особый случай – ложные, но определенные (а следовательно, абсолютно законные) значения. Далее было представлено более уродливое решение с тернарным оператором. В Perl 5.10 подобные проблемы решаются при помощи оператора //, использующего ускоренное вычисление при обнаружении определенного значения независимо от истинности или ложности значения в левой части. Даже если значение $last_name{$someone} равно 0, эта версия все равно работает:

use 5.010;
my $last_name = $last_name{$someone} // '(No last name)';

Иногда требуется присвоить переменной значение, если она еще не была инициализирована, и оставить ее без изменений в противном случае. Допустим, программа должна выводить сообщения только при заданной переменной среды VERBOSE. Мы проверяем значение, связанное с ключом VERBOSE в хеше %ENV. Если значение отсутствует, оно задается программой:

use 5.010;
my $Verbose = $ENV{VERBOSE} // 1;
print "I can talk to you!\n" if $Verbose;

Следующая программа проверяет, как работает оператор //: она перебирает несколько значений и смотрит, какие из них будут заменены значением по умолчанию default:

use 5.010;
foreach my $try ( 0, undef, '0', 1, 25 ) {
print "Trying [$try] ---> ";
my $value = $try // 'default';
say "\tgot [$value]";
}

Результат показывает, что строка default используется только в одном случае: если переменная $try содержит undef:

Trying [0] ---> got [0]
Trying [] ---> got [default]
Trying [0] ---> got [0]
Trying [1] ---> got [1]
Trying [25] ---> got [25]

В некоторых ситуациях требуется задать значение, если оно не было задано ранее.


Например, попытавшись вывести неопределенное значение при включенных предупреждениях, вы получите раздражающую ошибку:

use warnings;
my $name; # Значение не указано, undef!
printf "%s", $name; # Use of uninitialized value in printf ...

Иногда эта ошибка безобидна, и ее можно просто проигнорировать. Но если вы ожидаете, что выводимое значение может оказаться неопределенным, его можно заменить пустой строкой:

use 5.010;
use warnings;
my $name; # Значение отсутствует, undef!
printf "%s", $name // '';

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Автоинкремент и автодекремент
Значение автоинкремента
Значение ускоренного логического оператора
Логические операторы
Метки блоков