恭喜你!你的创业公司被超大企业收购了。 你需要把文件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函数则显得更加直白,我们之所以把它放进一个函数中调用,只是为了让代码的主体跟之前的一个版本类似。