Существует ли Perl, эквивалентный нулевому коалесцирующему оператору (??) в С#?

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

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

Ответы

Ответ 1

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

Пример A:

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

Пример B:

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

Ответ 2

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

 use 5.010;

 my $value = $this // $that;

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

 my $value = $this || $that;

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

 my $value = defined( $this ) ? $this : $that;

Ответ 3

Собственно, оператор короткого замыкания OR также будет работать при оценке undef:

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

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

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

Ответ 4

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

Здесь вы его получите - вернет первое определенное/непустое значение строки списка:

sub coalesce { (grep {length} @_)[0] }

Ответ 5

Не то, чтобы я знал.

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

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