Perl-pi-e';s//';文件名在perl脚本中不起作用。但它在命令行中工作
我有一个perl脚本,在该脚本中,我需要替换文件每行中的一个字符串。我在perl脚本的下面一行中使用了。它显示了Perl-pi-e';s//';文件名在perl脚本中不起作用。但它在命令行中工作,perl,Perl,我有一个perl脚本,在该脚本中,我需要替换文件每行中的一个字符串。我在perl脚本的下面一行中使用了。它显示了-pi-e附近的语法错误。我做错了什么 perl -pi -e 's/ / /' filename 我有一个管道分隔的文件要在perl脚本中使用。我使用BCP将文件内容加载到表中。我用8个clomun创建了这个表,但以管道分隔的文件只有7列。在该文件中,我需要在每个记录的末尾添加“|”(管道后跟空格)符号。因此,它将匹配表和BCP文件中的列数。因此,在perl脚本的一部分中,我需要
-pi-e
附近的语法错误。我做错了什么
perl -pi -e 's/ / /' filename
我有一个管道分隔的文件要在perl脚本中使用。我使用BCP将文件内容加载到表中。我用8个clomun创建了这个表,但以管道分隔的文件只有7列。在该文件中,我需要在每个记录的末尾添加“|”(管道后跟空格)符号。因此,它将匹配表和BCP文件中的列数。因此,在perl脚本的一部分中,我需要使用's/$/\\\\\/'概念。但我喜欢在perl脚本中的单行中完成这项工作。(就像在命令行中工作的perl-pi-e的//$/\\|/’)该行是shell命令。不是perl脚本。此行调用perl并为其提供程序:
s/ / /
Plus设置某些选项(-p,-i),但它仍然是shell程序调用,而不是Perl表达式。命令行代码是为shell编写的,在shell将控制权传递给
Perl
编译器/解释器程序之前进行解析
我们可以使用后端处理器来查看像这样执行的Perl代码
$perl -MO=Deparse -pi -e 's/ / /' filename
它显示了等效的Perl程序
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/ / /;
}
continue {
die "-p destination: $!\n" unless print $_;
}
但是为什么在打印之前要用另一个空间替换每个空间 从这个问题来看,我认为提出
B::Deparse
没有多大帮助,这是一个非常高级的工具。一般来说,这是一个很好的答案,但特别像最后一行。@doubleDown:知道实际发生了什么很有帮助。这就是他们问题的本质,对正在发生的事情缺乏理解。@doubleDown:我不是在解释如何使用B:Deparse
,我是在解释命令行程序相当于一个Perl脚本。我在Perl脚本中使用了一个管道分隔的文件。我使用BCP将文件内容加载到表中。我用8个clomun创建了这个表,但以管道分隔的文件只有7列。在该文件中,我需要在每个记录的末尾添加“|”(管道后跟空格)符号。因此,它将匹配表和BCP文件中的列数。因此,在perl脚本的一部分中,我需要使用's/$/\\\\\/'概念。但我喜欢在perl脚本中的单行中完成这项工作。(就像在命令行中工作的perl-pi-e的//$/\\\\;/)一样,我有一个管道分隔的文件用于perl脚本。我使用BCP将文件内容加载到表中。我用8个clomun创建了这个表,但以管道分隔的文件只有7列。在该文件中,我需要在每个记录的末尾添加“|”(管道后跟空格)符号。因此,它将匹配表和BCP文件中的列数。因此,在perl脚本的一部分中,我需要使用's/$/\\\\\/'概念。但我喜欢在perl脚本中的单行中完成这项工作。(类似于在命令行中工作的perl-pi-e的/$/\\|/)
$^I = "";
while (<>) {
s/ / /;
print;
}