Как уже упоминали другие, вполне возможно, что @list
никогда не получит значение в нем. Если $csv->getline_hr($fh)
вернет undef в первый раз, вы никогда не вставите ничего в @list
.
Есть две вещи, которые вы можете сделать:
- Вы можете проверить, не инициализирована ли
@list
перед печатью
- Вы можете ослабить прагму
use warnings
, чтобы не включать неинициализированные предупреждения:
Вот как вы можете провести тестирование:
if (@list) {
print "List = " . @list . "\n";
}
else {
print "List has no values\n";
}
Вы можете использовать scalar @list
, как показывает Игорь Зиновьев , но в данном случае это не является необходимым, и я думаю, что простое if (@list)
более понятно. Вы также можете использовать if (defined @list)
, что очень понятно, но в последние несколько лет не поощряется.
Если это временная вещь (просто посмотрите, работает ваш код или нет), вы можете ослабить использование строгого:
no warnings qw(uninitialized);
print "@list\n"; #Now you won't get a warning if @list has no value
use warnings; #Turn the warnings back on. It helps you code better
Небольшое слово: o Предупреждение: в этом случае ваше заявление ничего не напечатает, и это может еще больше сбить вас с толку. Всегда ставьте подсказку , чтобы убедиться, что что-то печатается:
print "\@list = @list\n";
Я предпочитаю это как временное решение , когда я печатаю много отладочных операторов, которые я позже удалю. Фактически, я создам специальную подпрограмму debug
для этих типов сообщений:
use strict;
use warnings;
use constant DEBUG_LEVEL => 1; #0 = no debug messages 1 = debug messages
[...]
while (yadda, yadda, yadda) {
push @list, $hr->{Name};
}
debug (qq(\@list = ") . join "|", @list . qq("));
[...]
sub debug {
my $message = shift;
return if (not DEBUG_LEVEL);
no warnings qw(uninitialized);
print qq(DEBUG: $message\n);
use warnings; #Not really needed since the code block ends
return $message;
}