#perl
#perl
Вопрос:
У меня есть функция ниже:
sub getMinFromParam {
my ($param) = @_;
print "PPPP = $paramn";
my $min;
if ($param =~ /s*[(S ),s*(S )]s*/) {
print "IN HEREn";
$min = $1;
}
elsif ($min =~ /((w ),) /) {
my @tmp = split (/s*,s*/, $param);
if ($tmp[0] =~ /[(w ),s?(w )]/) {
$min = $1;
}
else {
$min = $tmp[0];
}
}
return ($min);
}
Когда $param представляет собой строку типа: 120u, 421u, 53, 19, 41u, 53,
Я получаю сообщение об ошибке: использование неинициализированного значения в шаблоне match (m //) в этой строке:
if ($param =~ /s*[(S ),s*(S )]s*/) {
Почему он жалуется на неинициализированное значение, когда определен $param?
Ответ №1:
Это не так. Он жалуется на эту строку:
elsif ($min =~ /((w ),) /) {
По крайней мере, здесь с тестовыми данными 120u, 421u, 53, 19, 41u, 53
Что и ожидалось, поскольку $min
устанавливается только в том случае, если $param
совпадает, но elsif
выполняется только в том случае, $param
если не совпадает.
Вероятно, эта строка должна быть elsif ($param =~ /((w ),) /) {
, и в этом случае я не получаю предупреждения.
Ответ №2:
На самом деле $min
это не определено, и об этом сообщается при использовании strict
и warnings
. Это исправляет:
use strict;
use warnings;
sub getMinFromParam
{
my ($param) = @_;
print "PPPP = $paramn";
my $min;
if ($param =~ /s*[(S ),s*(S )]s*/)
{
print "IN HEREn";
$min = $1;
}
elsif (defined $min amp;amp; $min =~ /((w ),) /)
{
my @tmp = split (/s*,s*/, $param);
if ($tmp[0] =~ /[(w ),s?(w )]/)
{
$min = $1;
}
else
{
$min = $tmp[0];
}
}
return ($min);
}
getMinFromParam "120u, 421u, 53, 19, 41u, 53"
Комментарии:
1. Я только что понял ту же проблему… Но я этого не понимаю… Почему интерпретатор Perl жаловался на «if» вместо «elsif», который на самом деле вызывал проблему. У меня были предупреждения об использовании; также в верхней части моего кода.
2.@AlvinHo: Я не экстрасенс. Однако в моей системе сообщение об ошибке содержало правильный номер строки , а также соответствующее утверждение
Use of uninitialized value $min in pattern match (m//) at ./test.pl line 16.
Теперь я предполагаю, что вы, возможно, получаете сбитый номер строки из-за документов here, фильтра источника или специального способа запуска сценария не непосредственно в исходном файле как есть (?). О, и символы продолжения строки (в здешних документах?)3. @Элвин, во-первых, не существует такого понятия, как
elsif
оператор. Во-вторых,if
был специально разработан для выдачи предупреждений в середине формулировки много-много лет назад. Обновите свой Perl.4. @ikegami: спасибо, что придумали вероятное объяснение реальной жизни 🙂
5. Это должно было гласить «не существует такой вещи, как
elsif
оператор, поэтому вы не можете сказать, что предупреждение не исходит отif
«.