我正在尝试使用 perl 中的文件 I/O 从文件中读取数据。我想找到一个整数,比较它并在行中添加一个整数。我的文件由这样的行组成。
文件 mfile.txt start_value 0 end_value 13000 错误 30
我想比较end_value,并希望在该end_value之后添加 500 或 2000。
文件 mfile.txt start_value 0 end_value 13000 2000 错误 30
此编辑必须在同一文件中完成。我的代码是这样的。
print "Enter file ";
$file= <STDIN>;
chomp ($file);
open ( DATA, "+<$file") || die "No file";
while(<DATA>) {
print "$_n";
@line = split / /, $_;
print "$line[5]";
$epat = $line[5];
if ($epat > 10000) {
$line[6] = "2000 errors";
}
else {
$line[6] = "500 errors";
}
$_ = join (" ", @line);
print "$_";
print "n";
}
close DATA
我尝试将 $_ 转换为数组并通过调用其索引并进行比较来找到end_value。它工作正常,但是如何将此新编辑写入同一文件中的同一行?在此之后,文件不会更改。怎么做?
您可以使用perl -i
就地更改文件,但随后需要使用文件名填充@ARGV。无论如何,它会写入另一个文件并在后台重命名它。
实际上,您可以只使用一行:
perl -i~ -ape 's/(?=errors)/$F[5] > 10000 ? "2000 " : "500 "/e' -- filename
-i~
使用后缀创建文件的备份~
-a
将每行拆分为@F
数组-p
逐行读取输入或参数文件,并在处理后打印每一行s///e
执行替换,但将替换解释为要运行的代码(?=errors)
是一个前瞻断言,它匹配"错误"开始的位置,但不会替换匹配的部分? :
是三元运算符,它对应于表达式级别的if then else