Perl -pi -e的/ / /'文件名在perl脚本中不起作用。但它在命令行中工作

时间:2013-06-20 13:09:56

标签: perl

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

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

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

2 个答案:

答案 0 :(得分:3)

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

s/ / /

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

答案 1 :(得分: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;
}

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