如何重复搜索和增加文本文件中的值

时间:2017-01-30 12:02:52

标签: regex perl loops text replace

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

文件中有一行我想在循环中增加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/;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

启用use strict并使用警告,并且当您可能有$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