我正在写一个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
请解决问题....谢谢
答案 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)
从它的外观来看,您似乎正在尝试浏览匹配文件并打印与region
或vth
匹配到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?