如何使用Perl对文本进行字符串替换
恭喜你!你的创业公司被超大企业收购了。 你需要把文件README.txt里的Copyright Start-Up换成Copyright Large Corporation。
File::Slurp
如果你安装了File::Slurp, 而且文件不是太大,能完全载入你电脑的内存,这可以是一种解决方案:
use strict; use warnings; use File::Slurp qw(read_file write_file); my $filename = 'README.txt'; my $data = read_file $filename, {binmode => ':utf8'}; $data =~ s/Copyright Start-Up/Copyright Large Corporation/g; write_file $filename, {binmode => ':utf8'}, $data;
File::Slurp里的read_file函数会把整个文件读入到一个单一标量变量里。这里假定文件不是太大。
我们设置binmode => ':utf8'用以正确处理字符编码。 之后用一个带有/g修改标示符的正则表达式来全局地在所有旧文本出现的地方,将其替换成新文本。
然后我们保存内容到同一个文件中,再次使用binmode => ':utf8'来正确处理字符编码。
单纯使用perl替换文本
要是你没法安装File::Slurp,你可以实现一个它的函数的简单版本。 本例中,代码主要部分几乎一样,除了我们不传递参数以Unicode方式打开文件。 我们把这部分写进了函数里。你可以看到里边是如何调用open的。
use strict; use warnings; my $filename = 'README.txt'; my $data = read_file($filename); $data =~ s/Copyright Start-Up/Copyright Large Corporation/g; write_file($filename, $data); exit; sub read_file { my ($filename) = @_; open my $in, '<:encoding(UTF-8)', $filename or die "Could not open '$filename' for reading $!"; local $/ = undef; my $all = <$in>; close $in; return $all; } sub write_file { my ($filename, $content) = @_; open my $out, '>:encoding(UTF-8)', $filename or die "Could not open '$filename' for writing $!";; print $out $content; close $out; return; }
在函数read_file里,我们把$/(也被称作输入记录分隔符)变量设置为undef。 这常被称作slurp模式。它告诉perl的"行读取"操作符把文件的所有内容读入到一个标量变量里,并赋给左值:my $all = <$in>;。 我们也可以用local关键字来设置$/,以便其一旦退出所包含的的代码块后能被还原——在这里是一旦离开read_file函数。
write_file函数则显得更加直白,我们之所以把它放进一个函数中调用,只是为了让代码的主体跟之前的一个版本类似。
Published on 2013-05-04
If you have any comments or questions, feel free to post them on the source of this page in GitHub. Source on GitHub.
Comment on this post