我想将几个单独的内容移动到一个脚本中。
例如:
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;
}
非常感谢所有贡献的人。
答案 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上,Perl也会阅读它们。
#!/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
基本上会在您的程序周围进行一次循环。每行都以$_
的形式出现,您的代码会运行,最后会打印出$_
。重复。所以你可以拥有任意数量的陈述。