2013-04-05 3 views
-1

Я полный новобранец с Perl. То, что я пытаюсь сделать, - открыть список файлов, увеличить три разных переменных в каждом файле, сохранить файлы и закрыть.Приращение переменных в файлах

Переменные выглядеть следующим образом

This_Is_My_Variable03 
This_Is_My_Variable02 
This_Is_My_Variable01 

Переменная окончание в 01 в файле несколько раз. Переменные иногда являются частью строки символов. This_Is_My_Variable часть переменной никогда не изменяется.

Спасибо.

Это может быть не лучшим решением, но это работает

#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl 

use warnings; 
use strict; 

use Tie::File; 

tie my @data, 'Tie::File', 'myfile.txt' or die $!; 

s/(This_Is_My_Variable)(\d+)+/$1.++($_=$2)/eg for @data; 

untie @data; 

Спасибо Бородину за получение меня началось с Tie::File: это определенно помогло.

Второе решение с использованием в то время как петля

#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl 
use warnings; 

#use strict; 

sub inc { 
    my ($num) = @_; 
    ++$num; 
} 

open(FILE, "myfile.txt") || die $!; 
$i = 0; 
while (<FILE>) { 
    $string = $_; 
    if (/This_Is_My_Variable../) { 
     $string =~ s/(This_Is_My_Variable)(\d+)+/$1.++($_=$2)/eg; 
     print "$string \n"; 
     $i++; 
    } 
    else { 
     print "$string \n"; 
    } 
} 

close FILE; 
+4

Не могли бы вы показать нам, что вы пробовали? Чтение этих документов [open] (http://perldoc.perl.org/functions/open.html), [readline] (http: //perldoc.perl.org/functions/readline.html), [закрыть] (http://perldoc.perl.org/functions/close.html) и [Автоматическое увеличение и автоматическое уменьшение] (http://perldoc.perl.org/ perlop.html # Auto-increment-and-Auto-декремент), вы должны начать. – chansen

+2

StackOverflow действительно не подходит для изучения Perl с нуля. Почему бы вам не потратить немного времени на изучение основ, попробуйте [Modern Perl Book] (http://www.onyxneon.com/books/modern_perl/index.html) и вернитесь, если у вас остались вопросы. –

+1

** Попробуйте что-нибудь написать **, а затем, когда это не сработает, принесите его нам, чтобы помочь вам. Вы начинаете, мы помогаем. Мы не пишем его для вас. Покажите нам фактический код, который вы пробовали, а затем мы можем вам помочь. –

ответ

1

Ваш "Второе решение с использованием в то время как петля" имеет ряд проблем.

  • Никогда отключить use strict, чтобы получить программу работать. Все, что делает проблемы скрытия в коде

  • У вас есть неиспользуемая подпрограмма inc и неиспользуемая переменная $i

  • Вы должны всегда использовать форму трехпараметрической open, и лексические дескрипторы файлов

  • Нет необходимости проверять, содержит ли строка строку перед применением замены

  • Вы можете просто использовать ($2+1) в своей заменяемой строке, а не ssigning значения для $_ и приращение его ++($_=$2)

  • Если вы собираетесь использовать именованный переменные строки считываются из файла, то, как правило, вы должны использовать while (my $string = <$fh>) {...}. Для коротких блоков, как это лучше всего использовать $_

  • Вы не chomp вход, который был бы хорошо, за исключением вы печатаете дополнительный пробел и символ новой строки после каждой строки

  • Вы print "$string \n" в ваш код дважды. Это, возможно, также появляются только один раз за пределами структуры if

Этот код выполняет тот же самый процесс. Я надеюсь, что это помогает.

use strict; 
use warnings; 

open(my $fh, '<', 'myfile.txt') || die $!; 
while (<$fh>) { 
    s/(This_Is_My_Variable)(\d+)/$1.($2+1)/eg; 
    print; 
} 
+0

Бородин благодарит вас за объяснения. Это помогает. Я отметил это как правильный ответ, так как он работает, и мне нравится, что ваше подзадача лучше, чем тот, который я опубликовал. Твой более прямой. У меня один вопрос: почему вам не нужно закрывать файл? Я попытался закрыть $ fh; и получил ошибку. Большое спасибо за помощь. Вы второй человек, который советует использовать три формы параметров open, поэтому я начну с этого. – emptyshell

1
use strict; 
use warnings; 

use Tie::File; 

tie my @data, 'Tie::File', 'myfile' or die $!; 

s/(\d+)$/sprintf '%02d', $1+1/e for @data; 
+0

Я не совсем понимаю, что происходит с этим. Я использовал это, и он работает. Я не понимаю, как я не объявляю, что я увеличиваю. Он не работает в том, что я увеличиваю, внутри линии или ниже в теле. Позднее. #! perl = C: \ bin \ perl использовать предупреждения; использовать строгое; Использование Tie :: File; tie my @data, 'Tie :: File', 'myfile.txt' или die $ !; s/(\ d +) $/sprintf '% 02d', $ 1 + 1/e для @data; – emptyshell

Смежные вопросы