2015-02-20 6 views
0

Я вошел в курс Perl, и нам поручено взять файл input.txt (из адреса Gettysburg - который имеет все экземпляры слова «старый», измененный на «новый») и создание файла output.txt, который переключает «новый» обратно на «старый». У меня есть общее регулярное выражение, которое переключает все экземпляры «нового» на «старый», но оно должно работать независимо от случая во входном файле. Мне интересно, как я могу добавить это? Кроме того, я хочу проверить, правильно ли я смонтирован файл output.txt? Когда я запускаю то, что у меня есть, у меня нет файла output.txt, созданного в моем каталоге. Вот что у меня есть до сих пор:Regex и создание выходного файла (Perl beginner)

open(my $getty, "<", "input.txt") 
    or die "Cannot open < input.txt: $!"; 

open(my $getty, ">", "output.txt") 
    or die "Cannot open < output.txt: $!"; 

while(my $line = <$getty>) { 
    if ($line =~ 's/new/old/') { 
     $line =~ s/new/old/; 
    } 
} 
+1

Всегда 'use strict;' ... вы пытаетесь дважды использовать дескриптор '$ getty' (один для чтения и один для записи). «Использовать строгое», предупредил бы вас. – dgw

+0

Я добавлю 'use strict;'. Поэтому мне нужно создать новый Filehandle для моего открытого вывода - (понял). Как я могу написать все из моего файла input.txt в мой файл output.txt с переходом от «нового» к «старому»? Кроме того, я хочу предположить, что output.txt не существует во время выполнения кода. – Hayest

ответ

0

Вам не нужно устанавливать условие if.

while(my $line = <$getty>) { 
    $line =~ s/new/old/gi; 
} 
+0

OP включает условие 'необходимо работать независимо от случая во входном файле'. Это может означать NEW -> OLD и nEw -> oLd, new -> old и т. Д. Если случай замены не важен, i-switch достаточно. –

+0

Как это получить, чтобы написать в output.txt, который в момент выполнения не существует? – Hayest

+1

откройте его. Распечатайте его. – Sobrique

0

Хороший рецепт - изменить что-л. из оболочки Perl:

perl -pi.orig -e 's{old}{new}g' filename.txt 

Эта замена продукции в файл Filename.txt трейлеры исходного файла filename.txt.orig

+1

Я думаю, что yo означает -pi.orig, что вывод будет записан в файл. –

+0

Это правильно, спасибо. – dynax60

+0

Концептуально правильный, мой ввод был непростительным :-) –

0

Я предполагаю, что ваш курс закончится, однако здесь полный ответ для тех, кто может ему необходимо: if не нужно. Для создания файла вам нужно использовать print. Вот полный рабочий код (нет запятой после дескриптора в операторе печати):

use strict; 

open(my $in_file, "<", "input.txt") 
    or die "Cannot open < input.txt: $!"; 

open(my $out_file, ">", "output.txt") 
    or die "Cannot open < output.txt: $!"; 

while(my $line = <$in_file>) { 
    $line =~ s/new/old/i; 
    print $out_file $line; 
} 

Если дело входного слова должно быть одинаковым в выходном слове, это решение:

use strict; 

open(my $in_file, "<", "input.txt") 
    or die "Cannot open < input.txt: $!"; 

open(my $out_file, ">", "output.txt") 
    or die "Cannot open < output.txt: $!"; 

while(my $line = <$in_file>) { 
    $line =~ s{(new)} 
    { 
     my @chars = split '', $1; 
     my @old = qw/o l d/; 
     my @out; 
     foreach my $char (@chars) { 
      if($char =~ /\p{Uppercase}/) { 
       push @out, uc(shift @old); 
      } 
      else { 
       push @out, shift @old; 
      } 
     } 
     join('', @out); 
    }esi; 
    print $out_file $line; 
} 

Что происходит, я использую s{pattern}{replacement}. Модификатор e делает заменяющий код Perl, и s позволяет мне использовать пробелы в выражении. В коде репликации я прохожу через каждый символ «нового» (захвачен с помощью скобок, поэтому я могу проверить его в переменной $1). Если символ в верхнем регистре, я использую функцию uc, чтобы сделать выходной символ верхнего регистра.

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