2017-11-24 2 views
0

한 번에 하나의 파일을 열어 다른 파일을 열고 두 번째 파일의 첫 번째 파일에서 읽은 행의 일부를 검색하고 모든 인스턴스를 다른 부분으로 바꾸려고 시도합니다. 첫 번째 파일에서 읽은 줄의. 내가 그것을 실행하고 그것을 실행하고 콘솔에서 결과를 볼 수 있지만 파일이 수정되지 않습니다. 무엇이 실수 일 수 있습니다. 어떤 사람은 이것을 권유 할 수 있습니까?perl에서 파일의 내용을 변경하는 방법은 무엇입니까?

use strict; 
use warnings; 
use autodie; # die if problem reading or writing a file 

my $filename = 'compare.txt'; 
open(my $fh, '+<', $filename) or die "Could not open file '$filename' $!"; 



while(<$fh>){ 
    my $readline= "$_"; 

    print("\n"); 

    my @arr=split(',',$readline); 
    print($arr[0]."\n".$arr[1]); 
    replace($arr[0],$arr[1]); 

} 
close $fh; 

sub replace 
{ 
    my $search=shift(@_); 
    my $replace=shift(@_); 

    my $filename2 = 'replace.txt'; 
    open(my $fh1, '+<', $filename2) or die "Could not open file '$filename' $!"; 

    while(<$fh1>) 
    { 
     my $readline2= "$_"; 
     $readline2=~s/$search/$replace/g; 
     print($readline2); 
     print("\n"); 

    } 
    close $fh1; 

} 
+2

당신이 쓰는 결코 당신의 파일을 대체하지만 콘솔에 인쇄하면됩니다. 변경 사항이있는 새 파일을 작성한 다음 변경해야하는 파일 위로 이동해야합니다. – zdim

+0

'+ <'모드를 필요로하지 않으며 사용하지 마십시오; 독서를 위해''$ fh, '<', $ file ... '을 열어 라. – zdim

+0

'while (my $ readline = <$fh>) {..}'할 수 있고'$ readline'은'$ _'에 있었을 텐데 그 라인에 할당되고 루프에 존재합니다. – zdim

답변

1

하위 항목에서 파일의 줄을 반복 할 때 파일에 다시 써야합니다. 정규 표현식 대신 파일에 자동으로 쓰지 않습니다.

use strict; 
use warnings; 
use autodie; # die if problem reading or writing a file 
use File::Copy; 
my $filename = 'compare.txt'; 
open(my $fh, '+<', $filename) or die "Could not open file '$filename' $!"; 



while(<$fh>){ 
     my $readline= "$_"; 

     print("\n"); 

     my @arr=split(',',$readline); 
     print($arr[0]."\n".$arr[1]); 
     replace($arr[0],$arr[1]); 

} 
close $fh; 

sub replace 
{ 
     my $search=shift(@_); 
     my $replace=shift(@_); 

     my $filename2 = 'replace.txt'; 
     open(my $fh1, '+<', $filename2) or die "Could not open file '$filename' $!"; 
#open file to write to 
     open $newfile, '>', 'replace_tmp.txt'; 
     while(<$fh1>) 
     { 
       chomp; 
       my $readline2= "$_"; 
       $readline2=~s/$search/$replace/g; 
       print($newfile, $readline2); 
       print($newfile, "\n"); 
     } 
     close($fh1); 
     close($newfile); 
     move ('replaced.txt', 'replace.txt'); 
} 

이것은 간단한 방법입니다. 당신은 다시 같은 파일을 작성하는 File::Tie를 사용하고 이름을 변경하지 않도록, 또는 Path::Tiny 모듈의 열렬한 팬으로 perldoc

2

를 참조 할 수 있습니다, 나는 위와 같이 할 것 :

use 5.014; 
use warnings; 
use Path::Tiny; 

my %rep = map { split /,/ } path('compare.txt')->lines({chomp => 1}); 
path("replace.txt")->edit_lines(sub { 
    while(my($key,$val) = each(%rep)) { 
     s/$key/$val/g; 
    } 
}); 
+1

_Hey, 멋지네요? _ 그리고 모든 단일 대체 파일에 대해 대상 파일을 완전히 다시 작성하지 않아도됩니다. – PerlDuck

+0

굉장합니다. 간명 +1 – Hameed

관련 문제