在 $_ 中找到一个数字并在 perl 中将数据添加到 $_

find a digit in $_ and add data to $_ in perl

我正在尝试使用 Perl 中的文件 I/O 从文件中读取数据。我想找到一个整数,比较它并在行中添加一个整数。我的文件由这样的行组成。

file mfile.txt start_value 0 end_value 13000 errors 30

我想比较 end_value 并想在 end_value 之后添加 500 或 2000。

file mfile.txt start_value 0 end_value 13000 2000 errors 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) 是一个前瞻断言,它匹配 "errors" 开始的地方,但不会替换匹配的部分
  • ? :是三元运算符,在表达式层面上对应一个if then else