在检查时使用未初始化的值警告&#34;如果已定义<变量>&#34;

时间:2016-03-31 14:31:56

标签: perl

以下是大型代码的摘要,如果没有匹配则会打印Use of uninitialized value $match in string eq at <script path> line 7.

我正在使用if (!defined $match),它是否应该禁止此警告?我使用的是Perl版本5.18

my $match = '';
my $prematch = '';
my $i = 1;
$obj->{comm}->print( $command ); #$obj->{comm} is Net::Telnet
while ($match eq '' and $i < 3) {
   ( $prematch, $match ) = $obj->{comm}->waitfor( Match => "/$pattern/");
   print "\npattern not found, try again..." if (!defined $match); #line 7
   $i++;
}

3 个答案:

答案 0 :(得分:4)

waitfor似乎将$ match设置为undef,至少在某些时候。

while (! length $match && $i < 3)是检查它是否为空或定义的最简单方法,至少在非古代的perls中是这样。或者,如果waitfor从未将其设置为空字符串,则不要自己设置(my $match;)并使用while (! defined $match && $i < 3)

答案 1 :(得分:2)

这很尴尬,因为您必须初始化$n(这不是索引,所以应该是$match)和do只是为了设计一个while ... while ...而不是for做`

看起来像是一个无限循环的情况,插入了对结束循环条件的检查,但你只想尝试两次,所以一个简单的$obj->{comm}->print($command); my $match; for ( 1 .. 2 ) { my $prematch; ($prematch, $match) = $obj->{comm}->waitfor(Match => "/$pattern/"); last if defined $match; print "\npattern not found, try again..."; } # Here $match will still be undefined if there was no match after two tries 循环会做

或许这样的事情?

add_test_methods

答案 2 :(得分:0)

这应该这样做

my $match = '';
my $prematch = '';
my $i = 1;
$obj->{comm}->print( $command ); #$obj->{comm} is Net::Telnet
while (!$match and $i < 3) {
   ( $prematch, $match ) = $obj->{comm}->waitfor( Match => "/$pattern/");
   print "\npattern not found, try again..." if (!$match); #line 7
   $i++;
}

通过将''分配给$ match,您实际上是在定义它。如果$ match = undef,您的代码将起作用;像这样

my $match = undef;
my $prematch = '';
my $i = 1;

while (!defined $match and $i < 3) {
    print "\npattern not found, try again..." if (!defined $match); #line 7
    $i++;
}