我在Perl的子例程中有以下代码,我不断收到以下错误: 在catlist.pl第67行第2756行的模式匹配(m //)中使用未初始化的值$ nextLine。
sub extract_testdesc {
my @str = @_;
my $file = $_[0];
my $testname = $_[1];
my @fifo;
# Open the file
open( FILEHANDLE, $file ) or die "couldnt open";
while (<FILEHANDLE>) {
if ( $_ =~ m/\/\*\*/ ) { # if start of comment /**
undef(@fifo);
$nextLine = <FILEHANDLE>;
while ( $nextLine !~ m/\*\// ) { # Add all lines into array until */ is encountered
if ( $nextLine !~ m/\@testlogic.author/ ) {
$nextLine =~ s/\*//g;
if ( $nextLine ne "" ) {
push( @fifo, $nextLine );
}
}
$nextLine = <FILEHANDLE>;
}
}
if ( $_ =~ m/$testname/ ) {
return (@fifo);
}
}
close(FILEHANDLE);
}
我做错了什么?我是Perl的新手,所以感谢任何帮助。
答案 0 :(得分:0)
每当您在文件句柄上使用while循环时,它实际上与while (defined($_ = <FILEHANDLE>)) {
同义。这很有用,因为一旦文件句柄到达eof
,它就会退出循环。另一方面,您正在进行手动调用readline
调用而不进行测试以查看是否返回了任何内容,因此您的未初始化值警告。
总的来说,你的目标和逻辑令人困惑。但是,或许range operator的介绍会对你有所帮助吗?以下内容实现了我认为你的逻辑,但我很容易被误解。
sub extract_testdesc {
my ($file, $testname) = @_;
my @fifo;
# Open the file
open my $fh, '<', $file or die "couldnt open: $!";
while (<$fh>) {
if ( my $range = m{\Q/**} .. m{\Q*/}) {
@fifo = () if $range == 1;
push @fifo, $_;
} elsif ($_ =~ m/\Q$testname\E/ ) {
return (@fifo);
}
}
close($fh);
}