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

Raj*_*Raj 1 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
Run Code Online (Sandbox Code Playgroud)

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

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

编辑1:根据您的建议,我在一个脚本中编写了这个片段,当从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;
}
Run Code Online (Sandbox Code Playgroud)

编辑2:好的,所以这是我实施你的建议的方式.奇迹般有效!

批处理文件:

perl -i.bal MyScript.pl Cities.Txt
Run Code Online (Sandbox Code Playgroud)

MyScript.pl

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

while( <> ){
s/String_ABC/String_XYZ/g;
s/Manhattan/New_England/g;
print;
}
Run Code Online (Sandbox Code Playgroud)

非常感谢所有贡献的人.

bri*_*foy 8

-p包装的参数-E有:

while( <> ) {
    # argument to -E
    print;
    }
Run Code Online (Sandbox Code Playgroud)

所以,把所有的参数都-E放在while:

while( <> ) {
    s/String_ABC/String_XYZ/g;
    s/Manhattan/New_England/g;
    print;
    }
Run Code Online (Sandbox Code Playgroud)

-i$^I变量,它打开了一些特殊的魔力处理ARGV:

$^I = "bak";
Run Code Online (Sandbox Code Playgroud)

-E对Perl的那版本的新功能圈.您只需指定版本即可:

use v5.10;
Run Code Online (Sandbox Code Playgroud)

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

如果你想看到单行所做的一切,请-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
Run Code Online (Sandbox Code Playgroud)