1, 利用Tie::File模块来直接对文件内容进行修改。
#!/usr/bin/perl -w my $std="F160";
my $fast="FAST"; my $file=shift @ARGV;
updatefile2($file); sub updatefile2 {
if(defined($file)) { use Tie::File;
tie my @contents, 'Tie::File', "$file" or die "can't open $!\n";
for(@contents){
s/(.*[,])$std([,].*)/${}$fast${}/g
}
untie @contents; exit ;
} else {
print "please provide file name!\n";
}
2, 直接命令:
perl -pi -e 's/(.*[,])$std([,].*)/${1}$fast${2}/g' $file
3, 文件小的话,读取修改后再覆盖进去:
sub updatefile3 {
open FILE, $file or die "$!";
my @oldfile=<FILE>;
close FILE;
foreach(@oldfile) {
s/,$std,/,$fast,/g;
#s/,$fast,/,$std,/g;
}
open FILE, ">", $file or die "$!";
print FILE @oldfile;
close FILE;
}
4, 通过创建临时文件方式:
sub updatefile1 {
if(defined($file)) {
my $buffer="$file buffer"; # save the new data
my $bak = "$file.bak"; #back up the old data
open OPENFILE, "<", "$file" or die "can not open file:$!\n";
open OPENFILEE, ">", "$buffer" or die "can not open file:$!\n";
$^I=".bak";
while(<OPENFILE>) {
chomp;
s/,$std,/,$fast,/g;
#s/,$fast,/,$std,/g;
print "$_\n";
print OPENFILEE "$_\n" or die "can not write to $buffer: $!";
}
close OPENFILE; close OPENFILEE;
rename("$file", "$bak") or die "can not rename $file to $bak: $!";
rename("$buffer", "$file") or die "can not rename $buffer to $file: $!";
} else {
print "please provide file name!\n";
} }
5,一行一行的修改:
比如x.txt内容如下:
hello
world!
执行下面这个程序:
open(FH,"+<x.txt");
$line=<FH>;; #跳过第1行
$pos=tell(FH); #记录第2行起始位置
$line=<FH>;; #读入第2行内容
$line=~s/world/cosmos/; #进行一些更改
seek(FH,$pos,SEEK_SET); #重新定位到第2行起始位置
print FH $line; #更新第2行内容
close(FH);
然后x.txt就是这样了:
hello
cosmos!
要注意的地方就是更新文件时要用"+<"打开。