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

Если бы вы инвестировали всего 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