我有一个perl脚本,在该脚本中我需要在每行文件中替换一个字符串。我在perl脚本里面使用了下面的行。它显示-pi -e
附近的语法错误。我做错了什么?
perl -pi -e 's/ / /' filename
我有一个在perl脚本中使用的管道分隔文件。我正在使用BCP将该文件内容加载到表中。我用8个clomuns创建了表,但是管道分隔文件只有7列。在那个文件中我需要添加'| '(管道后跟空格)符号在每条记录的末尾。这样它将匹配表和BCP文件中的列数。因此,在perl脚本的一部分我需要使用's / $ / \ | /'概念。但我喜欢在perl脚本中以单行方式执行此操作。 (比如perl -pi -e的/ $ / \ | /'在命令行中工作)
答案 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;
}
但是为什么在打印之前用另一个空间替换每个空间?!