- Я думаю, что PBP ( Perl Best Practices ) - хорошее чтение в "строгом" стиле. Если
следуя тому, что он говорит, вы будете по крайней мере писать код, совместимый с
strict
и warnings
.
То, что я вижу, это неявные предупреждения. И, неявные предупреждения приходят с warnings
, а не strict
. Хотя обычно это идет рука об руку со строгим.
Для вашей конкретной ошибки важно понимать, что когда вы сдвигаете массив arg (который я склонен называть «deck»), пользователь метода / функции, возможно, ничего не передал в этой позиции. Таким образом, это хорошая идиома;
my $var1 = shift || '';
''
не инициализирован, поэтому предупреждение не будет получено. Троицы также являются хорошим средством, и я достаточно использую их в своем производственном коде.
Конечно, есть еще одна проблема. Если вы посмотрите на код выше, что я ожидаю? Я ожидаю, что $var1
, возможно, не было передано никаких данных. Если это так, и я все еще хочу привести его в соответствие - и в локальном коде есть достаточно подобных случаев - иногда вы просто делаете это:
# don't bug me about uninitialized stringed values
# just concatenate them
no warnings 'uninitialized';
return "var1 = ".$var1.", var2 = ".$var2.", var3 = ".$var3;
Это эквивалентно коду с кучей переменных:
my $var = shift || '';
Идея не должна застать врасплох 1037 * с неинициализированными данными - с политикой, которая соответствует экземпляру, а не рабским кодированием по стандарту.
Поскольку ваш саб достаточно прост, приведенный выше код будет работать. Но вы, вероятно, захотите сделать это в будущем, поэтому я предлагаю следующую конструкцию, чтобы изолировать части, которые у нас в порядке, с неинициализированными значениями и там, где вы не хотите, чтобы вас застали врасплох.
{ no warnings 'uninitialized';
$string = ...;
}
$obj_that_should_be_defined->do_something_objecty( $string );
do
блоки также полезны для этого.
$obj_that_should_be_defined->do_something_objecty(
do { no warnings 'uninitialized'; sprintf( ... ); }
);
Конечно, все, что вы передаете в качестве переменной, вы также можете фильтровать с помощью map
. Следующее работает, если вы просто хотите позаботиться о undefs.
$object->method( map { defined() ? $_ : '' } @anon_args );
- Я предупреждаю, что все, что еще не было проверено в области видимости - что-либо, поступающее откуда-то еще: параметр, ввод-вывод, захват регулярного выражения, возврат из функций - может быть неинициализировано. Практика хорошего кодирования должна заставить вас проверять все эти вещи ЕСЛИ , в данном случае вам небезразлично, являются ли они
undef
нет.
Теперь, часто люди проверяют неопределенные переменные, чтобы просто выдохнуть. С тех пор сообщения Perl стали лучше, и, возможно, могли бы они улучшиться в будущем. Возможно, нет необходимости специально крякать.
my $feldman = Feldman->new( qw<here is some data for you> )
or die 'Could not create Feldman!'
;
$feldman->dont_just_sit_there_do_something();
Однако без явного or die
приведенный выше код точно умрет, если $feldman
не определено. Вы не можете вызывать метод для неопределенного значения, поэтому есть причина для не конкретной проверки. Если $feldman
не определено, значит, вы его не создавали, есть еще один уровень вывода, который вы должны сделать: от неопределенного до сообщения об ошибке. Ни один из них не говорит нам , почему объект не был создан, просто это не так. (Конструктор должен был хотя бы придраться к тому, чего у него не было.)