В Perl, там корректный способ преобразовать undef в 0 вручную?

Я учился любить vi после наблюдения кого-то, кто был очень квалифицирован с ним, перешли вокруг для создания редактирований в безумно быстром клипе. Действительно можно кодировать быстро с ним. Другая причина мне нравится он, состоит в том, что иногда я нахожу, что mousing вокруг в IDE действительно повреждает мои руки через некоторое время, и vi обеспечивает хорошее изменение. Поскольку другие упомянули, что это также почти всегда доступно в системах Unix и работает хорошо даже по паршивым соединениям.

Одна вещь, которую я не видел упомянутый, состоит в том, что знание vi обладает дополнительным преимуществом "фаната cred" в некоторых кругах. Я могу думать о по крайней мере нескольких людях, которые хихикают, когда они видят, что новый программист разжигает nedit для внесения некоторых изменений в файл.

8
задан brian d foy 29 August 2009 в 21:13
поделиться

4 ответа

Хорошо, что вы используете строгое и предупреждения . Цель предупреждений - предупредить вас, когда Perl обнаруживает поведение, которое может быть непреднамеренным (и, следовательно, неправильным). Когда вы делаете это намеренно, вполне нормально отключить предупреждение локально. undef обрабатывается как 0 в числовом контексте. Если вас устраивает и неопределенное значение, и нулевое значение, просто отключите предупреждение:

my $total;
{
  no warnings 'uninitialized';
  $total = $some_href->{$code}{A} + $some_href->{$code}{B};
}

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

Если вы ' Обратно к отключению предупреждений, есть и другие варианты. Начиная с Perl 5.10 вы можете использовать оператор // (определенное или) для установки значений по умолчанию. До этого люди часто использовали || (логическое-ИЛИ), но это могло сделать неправильную вещь для значений, которые оценивались как ложные. Надежный способ установить значения по умолчанию в версиях Perl до 5.10 - проверить, определены ли они .

$x = $y // 42;             # 5.10+
$x = $y || 42;             # < 5.10 (fragile)
$x = defined $y ? $y : 42; # < 5.10 (robust)
16
ответ дан 5 December 2019 в 05:34
поделиться

Вы можете на секунду отключить предупреждение «не инициализировано»:

my $a;
my $b = 1;
{
    no warnings 'uninitialized';
    my $c = $a+$b; # no warning
}
my $c = $a+$b; # warning

Или вы можете замкнуть его на ноль:

my $d = ($a||0)+$b; # no warning

Хотя мне это не очень хорошо выглядит.

6
ответ дан 5 December 2019 в 05:34
поделиться
my $a = $some_href->{$code}{'A'} || 0;
my $b = $some_href->{$code}{'B'} || 0;
my $total = $a + $b;

В этом случае можно рассматривать ложные значения так же, как неопределенные значения из-за вашего резервного значения.

4
ответ дан 5 December 2019 в 05:34
поделиться

По мере добавления просто отфильтровывайте undefs.

use List::Util 'sum';

my $total = sum (0, grep {defined} $some_href->{$code}{'A'}, $some_href->{$code}{'B'});

Или даже

use List::Util 'sum';

my $total = sum (0, grep {defined} map {$some_href->{$code}{$_}} 'A', 'B');
4
ответ дан 5 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: