Я учился любить vi после наблюдения кого-то, кто был очень квалифицирован с ним, перешли вокруг для создания редактирований в безумно быстром клипе. Действительно можно кодировать быстро с ним. Другая причина мне нравится он, состоит в том, что иногда я нахожу, что mousing вокруг в IDE действительно повреждает мои руки через некоторое время, и vi обеспечивает хорошее изменение. Поскольку другие упомянули, что это также почти всегда доступно в системах Unix и работает хорошо даже по паршивым соединениям.
Одна вещь, которую я не видел упомянутый, состоит в том, что знание vi обладает дополнительным преимуществом "фаната cred" в некоторых кругах. Я могу думать о по крайней мере нескольких людях, которые хихикают, когда они видят, что новый программист разжигает nedit для внесения некоторых изменений в файл.
Хорошо, что вы используете строгое
и предупреждения
. Цель предупреждений - предупредить вас, когда 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)
Вы можете на секунду отключить предупреждение «не инициализировано»:
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
Хотя мне это не очень хорошо выглядит.
my $a = $some_href->{$code}{'A'} || 0;
my $b = $some_href->{$code}{'B'} || 0;
my $total = $a + $b;
В этом случае можно рассматривать ложные значения так же, как неопределенные значения из-за вашего резервного значения.
По мере добавления просто отфильтровывайте 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');