2017-01-30 2 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

(。技術的に[\d\.]+はそう1.2.3.4が有効で、ドットと数字の任意の組み合わせと一致する。しかし、それはまだ\Sよりはましだ)、あなたはおそらく自分で答えを見つけただろう(http://perldoc.perl.org/perlfaq5.html) –

答えて

0

電源を入れて、警告を使用し、また$xyz0

を意味しているかもしれときには、あなたが$xyzoを書いたことを教えましょう - あなたは$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\.]+を使用する方が良いでしょう。 [perlfaq5]:あなたがグーグルのわずか30秒を投資していた場合

+0

これを済ませたら、 '$ line =〜s/xyz0 =(\ S +)/ xyz0 = $ new_value /;'これをどのように書き戻すことができますか?テキストファイルに? – rahdirs

+0

新しいファイルに書き出し、元のファイルにコピーします。 – Sobrique

関連する問題