Оператор //

В предыдущем разделе мы показали, как присваивать значение по умолчанию при помощи оператора ||. Но при этом игнорировался особый случай – ложные, но определенные (а следовательно, абсолютно законные) значения. Далее было представлено более уродливое решение с тернарным оператором. В 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 ---> got 
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 // '';
Теги:
управляющие конструкции
Добавлено: 20 Июля 2018 20:17:25 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...