String 如何将几个Perl一行程序整合到一个脚本中?
我想把几个一行代码移到一个脚本中 例如:String 如何将几个Perl一行程序整合到一个脚本中?,string,perl,substitution,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批处理文件调用该脚本时,它只是挂
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;
}
MyScript.pl
#!/usr/bin/perl
use strict;
use warnings;
while( <> ){
s/String_ABC/String_XYZ/g;
s/Manhattan/New_England/g;
print;
}
#/usr/bin/perl
严格使用;
使用警告;
而(){
s/String_ABC/String_XYZ/g;
南/曼哈顿/新英格兰/g;
打印
}
非常感谢每一位对此做出贡献的人。你可以在#上发表观点!线Perl将读取它们,即使在Windows上也是如此
#!/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
基本上是在程序周围放置一个while循环。每一行都以$\u
的形式输入,您的代码运行,$\u
在最后打印出来。重复因此,您可以拥有任意数量的语句。您可以在#上放置参数!线Perl将读取它们,即使在Windows上也是如此
#!/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
基本上是在程序周围放置一个while循环。每一行都以$\u
的形式输入,您的代码运行,$\u
在最后打印出来。重复因此,您可以拥有任意数量的语句。将参数包装为-E
,其中包含:
while( <> ) {
# argument to -E
print;
}
-i
设置$^i
变量,该变量打开一些特殊的魔法处理ARGV
:
$^I = "bak";
-E
打开该版本Perl的新特性。只需指定版本即可:
use v5.10;
但是,您不会使用任何加载了它的内容,至少在您向我们展示的内容中是这样
如果您想查看单行程序的所有功能,请在其中添加:
% 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-MO=Deparse-i.bak-pE“s/Manhattan/New_England/g”Cities.Txt
开始{$^I=“.bak”}
开始{
$^H{'feature_unicode'}=q(1);
$^H{'feature_say'}=q(1);
$^H{'feature_state'}=q(1);
$^H{'feature_switch'}=q(1);
}
行:while(已定义($\u=)){
南/曼哈顿/新英格兰/g;
}
继续{
模具“-p目的地:$!\n”,除非打印$;
}
-e语法正常
-p
将参数包装到-E
,其中包含:
while( <> ) {
# argument to -E
print;
}
-i
设置$^i
变量,该变量打开一些特殊的魔法处理ARGV
:
$^I = "bak";
-E
打开该版本Perl的新特性。只需指定版本即可:
use v5.10;
但是,您不会使用任何加载了它的内容,至少在您向我们展示的内容中是这样
如果您想查看单行程序的所有功能,请在其中添加:
% 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-MO=Deparse-i.bak-pE“s/Manhattan/New_England/g”Cities.Txt
开始{$^I=“.bak”}
开始{
$^H{'feature_unicode'}=q(1);
$^H{'feature_say'}=q(1);
$^H{'feature_state'}=q(1);
$^H{'feature_switch'}=q(1);
}
行:while(已定义($\u=)){
南/曼哈顿/新英格兰/g;
}
继续{
模具“-p目的地:$!\n”,除非打印$;
}
-e语法正常
您确实意识到您可以使用一个单行程序,对吗perl-i.bak-pE“s/String_ABC/String_XYZ/g;s/Manhattan/New_England/g”Cities.Txt
Yes,但我有60多个替换要执行,通过命令行传递它们是不成立的。您确实意识到可以使用一个单独的一行程序,对吗perl-i.bak-pE“s/String_ABC/String_XYZ/g;s/Manhattan/New_England/g”Cities.Txt
Yes,但是我有60多个替换要执行,并且通过命令行传递它们是不成立的。-i与此无关,但它设置了$^i。shebang行中的多个参数不可移植。。。尽管我的Perl二进制代码处理得很好,这让我感到惊讶。这是什么时候开始的?@ephemient我从来没有听说过把开关放在#上有问题!行,已经做了很长时间了。有传单吗?Perl将开关从#中拉出!它本身已经有很长一段时间了,所以操作系统所做的可能是没有意义的/usr/bin/env perl。在linux上,它尝试执行一个名为“perl”的程序。在任何其他unix变体上,它使用指定的参数执行perl/usr/bin/perl-i.bak-p在/script.pl
中,Linux将运行'/usr/bin/perl'-i.bak-p'./script.pl'
(POSIX下完全可以接受的行为)。我很惊讶,但是一些实验表明Linux上的Perl5.10.1将在空格上重新拆分其参数…好的,-p添加了while循环和print语句。-i与此无关,但它设置了$^i。shebang行中的多个参数不可移植。。。尽管我的Perl二进制代码处理得很好,这让我感到惊讶。这是什么时候开始的?@ephemient我从来没有听说过把开关放在#上有问题!行,已经做了很长时间了。有传单吗?Perl将开关从#中拉出!它本身已经有很长一段时间了,所以操作系统所做的可能是没有意义的/usr/bin/env perl。在linux上,它尝试执行一个名为“perl”的程序。在任何其他unix变体上,它使用指定的参数执行perl/usr/bin/perl-i.bak-p在/script.pl
中,Linux将运行'/usr/bin/perl'-i.bak-p'./script.pl'
(POSIX下完全可以接受的行为)。我很惊讶,但是一些实验表明Linux上的Perl 5.10.1将在空格上重新划分参数。。。