问题描述
我想将多个 one liner 移到一个脚本中.
I would like to move several one liners into a single script.
例如:
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 操作.
Above works well for me but at the expense of two disk I/O operations.
我想将上述逻辑移到单个脚本中,以便所有替换都在文件打开和编辑后仅执行一次.
I would like to move the aforementioned logic into a single script so that all substitutions are effectuated with the file opened and edited only once.
根据您的建议,我在脚本中编写了此代码段,当从 Windows 批处理文件调用时,该代码段只是挂起:
Based on your recommendations, I wrote this snippet in a script which when invoked from a windows batch file simply hangs:
#!/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;
}
好的,这就是我实施您的建议的方式.就像魅力一样!
OK, so here is how I implemented your recommendation. Works like a charm!
批处理文件:
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;
}
非常感谢所有做出贡献的人.
Thanks a lot to everyone that contributed.
推荐答案
-p
将参数包裹到 -E
中:
The -p
wraps the argument to -E
with:
while( <> ) {
# argument to -E
print;
}
所以,把所有的参数带到 -E
并将它们放在 while
中:
So, take all the arguments to -E
and put them in the while
:
while( <> ) {
s/String_ABC/String_XYZ/g;
s/Manhattan/New_England/g;
print;
}
-i
设置了 $^I
变量,它开启了一些特殊的魔法处理 ARGV
:
The -i
sets the $^I
variable, which turns on some special magic handling ARGV
:
$^I = "bak";
-E
为该版本的 Perl 开启新功能.您只需指定版本即可:
The -E
turns on the new features for that versions of Perl. You can do that by just specifying the version:
use v5.10;
但是,您没有使用任何加载了它的东西,至少在您向我们展示的内容中是这样.
However, you don't use anything loaded with that, at least in what you've shown us.
如果您想查看单行程序所做的一切,请输入 -MO=Deparse
在那里:
If you want to see everything a one-liner does, put a -MO=Deparse
in there:
% 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
这篇关于如何将多个 Perl 单行代码合并为一个脚本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!