perl 修改文件内容
2019-07-26 本文已影响0人
SQUA2E
Perl修改原文件
以去掉一个文件中#开头的注释行为例.
一.命令行
-i 把源文件更名然后从这个更名的源文件里读取.最后把处理后的数据写入源文件
perl -i.bak -ne'print unless m/^#/' filename
二.代 码
$^I 使用用同 -i参数,使用于代码中.
(1) 直接程序后跟文件名.
(2) 把文件名放入@ARGV内置变量内.
然后使用<>操作符循环读取修改.
#!/usr/bin/perl -w
$^I='.bak';
push @ARGV,'filename';
while (<>) {
print unless m/^#/;
}
注意:使用以上参数后,文件将新建并作为程序的标准输出,程序里要包含print等输出语法,不然文件将为空.
$^I 原地编辑扩展的当前值。设置为 "undef" 时关闭原地编辑。(助记:-i开关的值。)
以上方式将产生一个与原文件相同大小的备份文件,下面方法真正在一个文件操作.
#!/usr/bin/perl -w
use strict;
open F1,'<', 'filename' or die;
open F2,'+<','filename' or die;
while ( <F1> ) {
print F2 unless m/^#/;
}
truncate(F2, tell(F2));
close F1;
close F2;
简要说一下原理:F1和F2将使用不用的文件指针,F1的指针一定大于等于F2的指针,F2为可读写方式打开,可以对其进行修改,tell()函数返回句柄当前的字节数,,truncate截断文件该字节数后面的内容.
方法三:
使用模块:
Tie::File模块将文本文件的内容绑定到一个数组中,
这样对数组的任何操作都将直接是对文本文件的修改
以下是例子
use Tie::File;
my @lines; # 文件关联数组
my $filename='./test.dat'; # 记录文件名
tie(@lines,'Tie::File',$filename) or die; # 将记录文件同数组关联,默认为文本型文件
# 记录分隔符使用"\r\n"或"\n"
$lines[0]="Hello"; # 这里对数组内容的操作就直接反映到文件中去了
$lines[1]="world!"; # 增加一条新记录
splice(@lines,1,0,"insert another line"); # 在老记录之间插入记录
delete $lines[0]; # 删除记录
untie(@lines); # 解除文件同数组的关联
方法四:
命令$^I
例子:
#!/usr/bin/perl
use strict;
$^I="";
while(<>){
s/^rate.*/rate=0/;
s/^testMode.*/testMode=0/;
print;
}
^I=".bak", 他就会把改过的文件命名为filename.bak了