如何将多个Perl单行合并到一个脚本中?

时间:2012-08-08 05:27:31

标签: string perl substitution

我想将几个单独的内容移动到一个脚本中。

例如:

perl -i.bak -pE "s/String_ABC/String_XYZ/g" Cities.Txt
perl -i.bak -pE "s/Manhattan/New_England/g" Cities.Txt

上面对我来说效果很好,但代价是两个磁盘I / O操作。

我想将上述逻辑移到一个脚本中,以便所有替换都是在打开和编辑一次的文件中完成的。

EDIT1:根据您的推荐,我在一个脚本中编写了这段代码,当从Windows批处理文件中调用时,它只会挂起:

#!/usr/bin/perl -i.bak -p Cities.Txt
use strict;
use warnings;

while( <> ){
s/String_ABC/String_XYZ/g;
s/Manhattan/New_England/g;
print;
}

EDIT2:好的,所以这就是我实施你的建议的方式。像魅力一样工作!

批处理文件

perl -i.bal MyScript.pl Cities.Txt

MyScript.pl

#!/usr/bin/perl
use strict;
use warnings;

while( <> ){
s/String_ABC/String_XYZ/g;
s/Manhattan/New_England/g;
print;
}

非常感谢所有贡献的人。

2 个答案:

答案 0 :(得分:8)

-p将参数包装为-E

while( <> ) {
    # argument to -E
    print;
    }

所以,把所有参数都带到-E并将它们放在while中:

while( <> ) {
    s/String_ABC/String_XYZ/g;
    s/Manhattan/New_England/g;
    print;
    }

-i设置$^I变量,该变量会启用一些特殊的魔法处理ARGV

$^I = "bak";

-E打开了Perl版本的新功能。您只需指定版本即可完成此操作:

use v5.10;

但是,你不要使用任何加载它的东西,至少在你向我们展示的东西中。

如果您想查看单行所做的所有内容,请在其中添加-MO=Deparse

% perl -MO=Deparse -i.bak -pE "s/Manhattan/New_England/g" Cities.Txt
BEGIN { $^I = ".bak"; }
BEGIN {
    $^H{'feature_unicode'} = q(1);
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
LINE: while (defined($_ = <ARGV>)) {
    s/Manhattan/New_England/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

答案 1 :(得分:1)

你可以在#上加上参数!线。即使在Windows上,Pe​​rl也会阅读它们。

#!/usr/bin/perl -i.bak -p

s/String_ABC/String_XYZ/g;
s/Manhattan/New_England/g;

或者你可以像@ephemient在评论中所说的那样保持单行。

perl -i.bak -pE "s/String_ABC/String_XYZ/g; s/Manhattan/New_England/g" Cities.Txt

-i + -p基本上会在您的程序周围进行一次循环。每行都以$_的形式出现,您的代码会运行,最后会打印出$_。重复。所以你可以拥有任意数量的陈述。