Perl жалуется на неинициализированное значение в регулярном выражении

#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 «.