在字符串ne中使用未初始化的值$ line

时间:2014-02-18 04:31:26

标签: regex perl

我正在写一个perl中的模式匹配程序..但是收到错误..我已经看过所有关于此事的早期帖子但是没有找到解决方案......因为我是perl的新手所以我是没有得到这个错误到底是什么..

use of uninitialized value $line in string ne at line .. and in line ...

我在这附加一个perl文件

use strict;

use warnings;

my $line = "";

open(OUTFILE, ">output.txt") or die ("cannot open file.\n");

if(open(file1,"match.txt") or die "Cannot open file.\n"){
    $line = <file1>;

    while ($line ne "") {
    if (defined($line) && (line =~ m/\sregion\s/i)) {
        print OUTFILE ("$line")};
        $line = <file1>;  # Problem Here
        if (defined($line) && ($line =~ /\svth\s/)) {
            print OUTFILE ("$line")
            };

        $line = <file1>;  # Problem Here
    }
}

我的match.txt文件包含此类数据..

Some text here

   region     Saturati   Saturati     Linear   Saturati   Saturati

    id        -2.1741m   -2.1741m   -4.3482m    2.1741m    2.1741m 

    vth     -353.9140m -353.9141m -379.2704m  419.8747m  419.8745m

Some text here  

请解决问题....谢谢

3 个答案:

答案 0 :(得分:1)

如果您无法阅读任何内容,您的字符串将返回未定义...这就是您看到该消息的原因。

另外,在创建输出文件之前,最好先检查一下是否打开输入文件,如下所示:

open(INFILE,  "<match.txt")  or die "Cannot open input file";
open(OUTFILE, ">output.txt") or die "cannot open output file";

my $line;
while($line = <INFILE>){
    ...
}

如果$ line未定义或为空字符串,Perl将结束循环。

答案 1 :(得分:1)

您看到这些错误的原因是变量$line包含undef。它包含undef的原因是您在文件到达其结尾<file1>后为其分配了readline()eof)的值。这在perldoc -f readline

中有所描述
  

在标量上下文中,每个               call read并返回下一行,直到end-of-file为止               到达,随后的呼叫返回“undef”。

您遇到此错误的原因是您没有使用传统的方法来读取文件。通常,您可以这样做来读取文件:

while (<$fh>) {
    ...
}

这将迭代文件中的所有行,直到它到达文件末尾,之后,如您所知,readline返回undef并退出while循环。

这也意味着您无需检查每个其他行是否已定义$line或为空。此外,您可以将正则表达式合并为一个,并且通常会删除大量冗余代码:

while (<>) {
    if (/\b(?:region|vth)\b/i) {
        print;
    }
}

这是你所使用的功能的核心,我在这里使用一些Perl习语:菱形运算符<>将从你给脚本作为参数的文件名中读取,或者如果没有参数则从STDIN读取给出。如果没有给出参数,许多内置函数都使用$_变量,这是print所做的,以及while循环条件。

您可能还会注意到我在正则表达式中使用了单词边界\b而不是空格\s,并且还使用了非捕获括号|的替换(?:...),这意味着它可以匹配其中一个字符串。

使用这个简化的脚本,您可以:

perl script.pl match.txt > output.txt

提供您的文件名。

答案 2 :(得分:0)

从它的外观来看,您似乎正在尝试浏览匹配文件并打印与regionvth匹配到output.txt的所有行。

我为您简化了代码:

use strict;
use warnings;

open(my $out_fh, ">", "output.txt") || die ("Cannot open file.\n");
open(my $file1, "<", "match.txt") || die ("Cannot open file.\n");

while( <$file1> ) {
    if ( /\s(region|vth)\s/i) {
        print $out_fh $_;
    }
}

这个问题详细介绍了检查变量是否已定义或为空:In Perl, how can I concisely check if a $variable is defined and contains a non zero length string?

以下是有关打开文件的详细信息:What's the best way to open and read a file in Perl?