0

我的问题:如果在C:\text_file.txt调用我的 PERL 脚本时在命令行上将我作为参数给出并且text_file.txt包含文本“Hello World World World”,如何将“World”的所有实例替换为“Earth”?

我是 PERL 的新手。我正在编写一个接受文件路径参数的脚本。我想对文件的内容进行查找替换。我知道我可以做这样的事情:$string =~ s/World/Earth/g;但如果我能提供帮助,我不想将文件读入字符串。有没有办法直接在文件上执行此操作而不将其作为字符串读取?谢谢!

4

1 回答 1

3

这就是 Perl 的-i(“就地编辑”)开关的用途:

$ perl -i.bak -pe 's/World/Earth/g' text_file.txt

编辑:要将这个相同的功能合并到一个更大的 Perl 脚本中:

{
    local $^I = '.bak';
    local @ARGV = ('text_file.txt');
    local $_;
    while (<>) {
        s/World/Earth/g;
        print;
    }
}

$^I变量反映了-i命令行开关的值;在这里,它是手动设置的。此外,@ARGV正在手动设置为通常从命令行获取的文件列表。整个东西被包裹在一个块中,这样$^I@ARGV,用 设置local,之后恢复它们的原始值;这可能不是绝对必要的,具体取决于程序的其余部分。我还进行了本地化$_,以防止while循环破坏它先前持有的值;这也可能没有必要。

请注意,如果您想避免创建备份文件,可以只使用-i而不是-i.bak从命令行使用。相应的代码将$^I = ""代替$^I = '.bak'.

于 2012-08-30T23:56:25.403 回答