2017-01-30 44 views
-2

我必須從文本文件中搜索和增加某些數據。我可以提取並打印出數據,但我不確定如何更新/增加數據。如何重複搜索和增加文本文件中的值

我想在循環中增加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/; 
     } 
    } 
} 
+0

如果你只投入了30秒的搜索結果,你可能會自己找到答案:[perlfaq5] (http://perldoc.perl.org/perlfaq5.html) –

回答

0

打開使用嚴格和使用警告,並且會告訴你,你已經寫$xyzo時可能意味着$xyz0

而且 - 你正在做的$xyz0的替代,而不是$line

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

它可以工作,但隨着它立即超出範圍,它實際上沒有任何用處。

也許你的意思是:

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

雖然如果你的線比僅僅有上有沒有價值更復雜,你跑「打」了錯誤的價值在那裏的風險。 (例如,如果$xyz0與線上的另一件事是相同的值)。你可能想要做的:

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

\S+是一個有點粗暴的方式來抓住你想要什麼,雖然 - 它捕獲「非空白」,但可以是事物號碼等mutiplying到1.15會產生假結果。最好使用\d+[\d\.]+來降低發生的可能性。 (技術上[\d\.]+匹配點和數字的任何組合,所以1.2.3.4是有效的,但它仍然比\S更好)

+0

完成這些之後,'$ line =〜s/xyz0 =(\ S +)/ xyz0 = $ new_value /;'我怎麼寫回來到文本文件? – rahdirs

+0

將它寫入一個新文件,將其複製到原始文件中。 – Sobrique

相關問題