2

当我在命令行中使用“sed”时,它正在工作,但当包含在 perl 脚本中时却没有。

一个例子是 sed 's/\s+//g' aaa > bbb

但是说当我试图通过 perl 脚本调用相同的命令时

$gf = `sed 's/\s\+//g' aaa > bbb` ;

输出文件与输入文件相同!!!!请建议。

4

3 回答 3

4

在 Perl 中,反引号与双引号字符串具有相同的转义和插值规则:形成未知转义码的反斜杠会忘记反斜杠,例如"\." eq ".".

因此,Perl 代码

print `echo \"1\"`;
print `echo \\"1\\"`;

输出

1
"1"

如果您想将该sed命令嵌入到 Perl 中,您必须转义反斜杠,以便它们甚至可以到达shell:

$gf = `sed 's/\\s\\+//g' aaa > bbb`;

实际上,当您将输出重定向到文件时,您不会得到任何输出$gf。我们可以做

use autodie;

system "sed 's/\\s\\+//g' aaa > bbb";

或单引号:

use autodie;

system q{ sed 's/\s\+//g' aaa > bbb };

保留反斜杠。

尽管如此,这是非常不必要的,因为 Perl 可以自己应用替换。

use autodie; # automatic error handling

open my $out, ">", "bbb";
open my $in,  "<", "aaa";
while (<$in>) {
  s/\s\+//g; # remove all spaces followed by a plus
  print {$out} $_;
}
于 2013-06-21T11:27:24.370 回答
0

在这些奇怪的情况下,我确保我正在运行正确的命令。我将构建它、存储它并输出命令,这样我就可以准确地看到我创建的内容:

my $command = '....';
print "Command is [$command]\n";
my $output = `$command`;

如果你sed从 Perl 运行,你可能做错了,因为 Perl 已经可以做到这一切。

于 2013-06-21T11:52:31.300 回答
-2

你有吗

  use strict;
  use warnings;

在文件的顶部?

你可能需要反引号来执行命令

  $gf = `sed 's/\s\+//g' aaa > bbb`;
于 2013-06-21T11:26:59.603 回答