以下是大型代码的摘要,如果没有匹配则会打印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++;
}
答案 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++;
}