Есть ли Perl-эквивалент оператора объединения null (??) в C #?

Мне очень понравился оператор ?? в C #. И я вполне привык к тому, что там, где есть что-то удобное на каком-то языке, скорее всего, это и Perl.

Однако я не могу найти ?? эквивалент в Perl. Есть ли?


person Karel Bílek    schedule 12.12.2009    source источник


Ответы (5)


Начиная с версии 5.10 существует оператор //, который семантически эквивалентен, если вы считаете, что концепция undef в Perl эквивалентна концепции null в C #.

Пример А:

my $a = undef;
my $b = $a // 5;  # $b = 5;

Пример Б:

my $a = 0;
my $b = $a // 5;  # $b = 0;
person Adam Bellaire    schedule 12.12.2009
comment
да, я автоматически подумал о undef как о эквиваленте NULL, спасибо - person Karel Bílek; 12.12.2009
comment
Идиома до 5.10 - это просто defined($a) ? $a : $b, которая выполняет свою работу и достаточно ясно читается. - person hobbs; 12.12.2009
comment
hobbs: да, но мне пришлось бы написать это 2 раза (что не то же самое, когда это, например, вызов подпрограммы) - person Karel Bílek; 12.12.2009
comment
кстати, мне очень нравится, что моя предпосылка, когда функция хороша, вероятно, и в Perl все еще сохраняется :) - person Karel Bílek; 12.12.2009

Как сообщает ,, в Perl 5.10 есть оператор //, который проверяет его левый оператор на определенность, а не на истинность:

 use 5.010;

 my $value = $this // $that;

Если вы используете более раннюю версию Perl, это немного запутано. || не будет работать:

 my $value = $this || $that;

В этом случае, если $this равно 0 или пустой строке, оба из которых определены, вы получите $that. Чтобы обойти это, идиома состоит в том, чтобы использовать условный оператор, чтобы вы могли сделать свою собственную проверку:

 my $value = defined( $this ) ? $this : $that;
person brian d foy    schedule 25.09.2010

Фактически, оператор короткого замыкания ИЛИ также будет работать при вычислении undef:

my $b = undef || 5;  # $b = 5;

Однако при оценке 0, но истинно, он не сработает:

my $b = 0 || 5;  # $b = 5;
person Pedro Silva    schedule 14.12.2009

Вопрос подразумевает любое количество аргументов, поэтому ответ подразумевает подпрограмму:

Вот и все - вернет первое определенное / непустое строковое значение списка:

sub coalesce { (grep {length} @_)[0] }
person ecodix    schedule 25.01.2013
comment
Я думаю, что в этом нет необходимости, многократное использование // тоже должно работать. - person svick; 25.01.2013

Не то, что я знаю из.

На самом деле Perl не является большим пользователем нулевой концепции. У него есть проверка, является ли переменная неопределенной. Нет специального оператора, подобного ?? хотя, но вы можете использовать условный оператор?: с тестом undef и подойти довольно близко.

И я ничего не вижу в списке операторов perl либо.

person whatsisname    schedule 12.12.2009
comment
ну, вы мне не ответили, но благодаря странице я понял, что мой вопрос был немного неправильным, и я могу просто использовать простой || (Ставлю как отдельный ответ) - person Karel Bílek; 12.12.2009