如何从Perl中使用反引号捕获的输出中修剪空格?

时间:2010-05-14 16:24:39

标签: perl whitespace

我正在从外部程序中捕获一些输出:

  my $cmd = "grep -h $text $file2 $file1 | tail -1 | awk '{print \$NF }' ";
  my $port_number;
  $port_number =`$cmd`;

  print "port No : ==$port_number==";

输出在端口号周围有额外的空格:

port No : == 2323

==

我尝试了chomp,但它没有用。

5 个答案:

答案 0 :(得分:4)

您的一个问题是您不需要使用任何外部命令来执行您正在执行的操作。留在Perl中,它具有内置的正则表达式,文件处理和awk功能:

my $last_matching_line;
{
local @ARGV = ( $file2, $file1 );

while( <> )
    {
    next unless /$text/;
    $last_matching_line = $_;
    }
}

my( $port_number ) = ( split /\s+/, $last_matching_line)[-1];

print "port No : ==$port_number==";

答案 1 :(得分:3)

来自perldoc

:“你实际上可以选择任何左值,包括作业:”

所以你想要:

chomp($port_number =`$cmd`);

答案 2 :(得分:2)

您可以使用以下方法删除所有空格:

$port_number =~ s/\s+//g;

答案 3 :(得分:2)

我将通过向您指出chomp的文档来尝试在这里阅读您的想法并通过“它不起作用”找出您的意思:

  

这个更安全的“chop”版本删除了对应于$ /的当前值的任何尾随字符串(也称为$ INPUT_RECORD_SEPARATOR in   “英语”模块)。 返回从其所有参数中删除的字符总数

要正确使用它(假设您想要其余字符串,而不是换行符),请不要使用其返回值:

my $port = `$cmd`;
chomp $port;
print "$port\n";

您可以在核心模块String::Util中使用trim删除任何不受欢迎的周围空白:

use String::Util 'trim';
trim $port;

答案 4 :(得分:-1)

chomp仅删除最后一个换行符。尝试这样的正则表达式:

s/(?:\r?\n)*$//