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将在空格上重新划分参数。。。