【问题标题】:How to repeatedly search and increment a value in a text file如何重复搜索和增加文本文件中的值
【发布时间】:2017-01-30 12:02:52
【问题描述】:

我必须从文本文件中搜索和增加某些数据。我可以提取并打印出数据,但我不确定如何更新/增加它。

文件中有一行数据我想在循环中增加 15%。

+xyz0 = 0.5 tg = 0.512 kjkj = 7543

我想在循环中增加abc0 旁边的值,每次增加 15%,将其写入文本文件,运行并重复。

open my $fh, "<" , ".....lib" or die "$!";

for ( my $i = 0; $i < 10; $i++ ) {

    while ( my $line = <$fh> ) { 

        if ( my ($xyz0) = $line =~ m/xyz0 = (\S+)/ ) {
              print $xyz0, "\n"; # this prints 0.005 
              $new_value = $xyzo * 1.15; 
              $xyz0 =~ s/$xyz0/$new_value/;
        }
    }
}

【问题讨论】:

  • 如果您只投入了 30 秒的谷歌搜索,您可能会自己找到答案:perlfaq5

标签: regex perl loops text replace


【解决方案1】:

打开 use strict 和 use warnings,这会告诉你你写了$xyzo,而你的意思可能是$xyz0

另外 - 您正在替换 $xyz0 而不是 $line

 $xyz0 =~ s/$xyz0/$new_value/

它会起作用,但由于它立即超出范围,它实际上不会做任何有用的事情。

也许你的意思是:

$line =~ s/$xyz0/$new_value/;

尽管如果您的线路比仅在其中设置该值更复杂,您确实会冒着“击中”错误值的风险。 (例如,如果 $xyz0 与在线上的另一件事的值相同)。你可能想做:

$line =~ s/xyz0 = (\S+)/xyz0 = $new_value/; 

\S+ 是一种粗略的方式来捕捉你想要的东西 - 它捕捉“非空白”,但这可能是 不是数字的东西,所以乘以 1.15 是会产生虚假的结果。最好使用\d+[\d\.]+ 来降低发生这种情况的几率。 (技术上[\d\.]+匹配点和数字的任意组合,所以1.2.3.4是有效的。但它仍然比\S好)

【讨论】:

  • 完成后,$line =~ s/xyz0 = (\S+)/xyz0 = $new_value/; 怎么写回文本文件?
  • 将其写入新文件,将其复制到原始文件上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多