-1

我有一个 perl 脚本,在该脚本中,我需要在文件的每一行中替换一个字符串。我在该 perl 脚本中使用了下面的行。它在 附近显示语法错误-pi -e。我究竟做错了什么?

perl -pi -e 's/ / /' filename 

我有一个要在 perl 脚本中使用的管道分隔文件。我正在使用 BCP 将该文件内容加载到表中。我用 8 clomuns 创建了表,但管道分隔文件只有 7 列。在该文件中,我需要添加 '| '(管道后跟空格)符号在每条记录的末尾。这样它将匹配表和 BCP 文件中的列数。因此,在部分 perl 脚本中,我需要使用 's/$/\| /' 概念。但我喜欢在 perl 脚本中以单行方式执行此操作。(就像在命令行中工作的 perl -pi -e 's/$/\| /' )

4

2 回答 2

3

该行是shell命令。不是 perl 脚本。此行调用 perl 并为其提供程序:

s/ / /

Plus 设置了某些选项(-p,-i),但它仍然是shell程序调用,而不是 Perl 表达式。

于 2013-06-20T13:32:04.723 回答
3

命令行代码是为shell在将控制权传递给perl编译器/解释器程序之前编写的。

我们可以使用B::Deparse后端处理器来查看正在执行的 Perl 代码是这样的

$perl -MO=Deparse -pi -e 's/ / /' filename

它显示了等效的 Perl 程序

BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    s/ / /;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

BEGIN只要我们确定$^I首先定义的,我们就可以删除该块。标签LINE可以消失,因为它从未被使用过。我们也可以避免对成功的检查print。再加上 Perl 在实际代码中允许的一些语法便利,我们得到了这个

$^I = "";
while (<>) {
    s/ / /;
    print;
}

但是为什么在打印之前用另一个空格替换每个空格?!

于 2013-06-20T13:48:35.897 回答