2009-09-03 489 views

回答

3

可以使用的Perl背蜱运行shell命令,并将结果保存在数组中。

my @results = `$command`; 

要得到shell命令只是一个结果,你可以将其存储在一个标量:

my $result = `$command`; 

如果你期望的输出回多条线路,它更容易使用数组,但如果你只是期待回到一行,最好使用标量。

(类似的东西,我的Perl是生锈)

10

使用 “反引号”:

my $command = "cat $input_file | uniq -d | wc -l"; 
my $result  = `$command`; 

如果有兴趣的退出代码,你可以捕捉它:

my $retcode = $?; 

在进行外部通话之后。

0

我假设这是一个“人为”的例子,因为这是 等价物:'uniq -d $ input_file | wc -l'。

在几乎所有的经验中,将结果 置入perl变量的唯一原因是解析后者。在这种情况下,我用 以下模式:

$last = undef; 
$lc = 0; 
open(FN, "$input_file"); 
while (<FN>) { 
    # any other parsing of the current line 
    $lc++ if ($last eq $_); 
    $last = $_; 
} 
close(FN); 
print "$lc\n"; 

这也有增加的优点:

  • 没有叉壳,猫,uniq的,和厕所
  • 更快
  • 解析并收集所需的输入
+0

open()或死($!); – 2009-09-03 23:33:34

6

perlfaq8


为什么我不能用system()得到命令的输出?

你在混淆system()和反引号(````)的用途。 system()运行一个命令并返回退出状态信息(作为一个16位值:低7位是进程死亡的信号,如果有的话,高8位是实际的退出值)。反引号(``)运行命令并返回它发送到STDOUT的内容。

$exit_status = system("mail-users"); 
$output_string = `ls`; 
1

您可以按照其他人的建议使用反引号。如果你信任你用来构建命令的变量,那很好。

为了获得更大的灵活性,您可以使用open命令作为管道并从中读取文件。当你想将变量作为命令行参数传递给程序并且你不相信它们的源代码没有shell转义字符时,这是特别有用的,因为近期Perl(> = 5.8)中的open能够调用程序从一个参数列表。所以,你可以做到以下几点:

open(FILEHANDLE, '-|', 'uniq', 'some-file.txt') or die "Cannot fork: $!\n"; 
while (<FILEHANDLE>) { 
    # process a line from $_ 
} 
close FILEHANDLE or die "child error: $!\n"; 
1

IPC ::系统::简单的提供了“捕捉”命令,它提供了一个安全,可移植的替代反引号。它(和来自这个模块的其他命令)是强烈推荐的。

+0

感谢您指出该模块。 – 2009-09-04 16:25:44

相关问题