2013-07-15 51 views
2

我想在我的文件中用'bad'替換模式'good'。目前我正在做的是:在不讀取整個文件的情況下替換文件中的模式 - Perl

#!/perl/bin/perl 

$filename= "abc.txt"; 

open my $fh, $filename; 
my $text = do { local($/); <$fh> }; 
close $fh; 
$text =~s/good/bad/g; 

有什麼辦法可以做到這一點,而無需閱讀整個文件?

編輯:假設我知道文件中只有1個'好'。

P.S.,你好我是新來的。希望我做得正確。

+0

當然不是。你怎麼知道沒有讀取整個文件的文件中有多少'好'? :S – m0skit0

+0

假設我知道文件中只有一個'好',那麼有什麼辦法嗎? –

+0

這是另一個問題。你應該在你的OP中指出。是的你可以。看到[這個答案](http://stackoverflow.com/questions/4505381/perl-read-line-by-line)如何逐行讀取文件,這應該足以解決您的問題。一旦你擊中了一條具有「好」的線並將其替換,你可以退出循環。 – m0skit0

回答

2

你可以使用Tie::File

#!/usr/bin/perl 
use strict; 
use Tie::File; 
my $filename = ...; 
tie my @lines, 'Tie::File', $filename or die; 
for (@lines) { 
    s/good/bad/g and last; 
} 

太確保不是整個文件咕嚕咕嚕在你想要閱讀的線一個接一個,例如使用:

#!/usr/bin/perl 
use strict; 
use Tie::File; 
my $filename = ...; 
tie my @lines, 'Tie::File', $filename or die; 
for(my $i=0; ; $i++) { 
    last if !defined $lines[$i]; # eof 
    last if $lines[$i] =~ s/good/bad/g; 
} 
+0

但是這裏整個文件也被讀入'@lines'數組中,對嗎? –

+0

你說得對,看第二個例子。 –

相關問題