在模式匹配中使用未初始化的值

时间:2014-07-30 05:38:40

标签: regex perl initialization

我在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的新手,所以感谢任何帮助。

1 个答案:

答案 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);
}