如何在Perl中使用反勾号从捕获的输出中修剪空白?
我正在从外部程序捕获一些输出:如何在Perl中使用反勾号从捕获的输出中修剪空白?,perl,whitespace,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 == 我试过了,但没用 您可以使用以下命令删除所有空白: $port_numbe
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
==
我试过了,但没用 您可以使用以下命令删除所有空白:
$port_number =~ s/\s+//g;
chomp仅删除最后一个换行符。尝试这样的正则表达式:
s/(?:\r?\n)*$//
在这里,我将试着读懂您的想法,并通过向您指出以下文档来理解它不起作用的含义: 这个更安全的chop版本会删除与当前值$/对应的任何尾随字符串,该值在中也称为$INPUT\U RECORD\U分隔符 英语模块。它返回从其所有参数中删除的字符总数 要正确使用它,假设您想要的是字符串的其余部分,而不是换行符,请不要获取其返回值:
my $port = `$cmd`;
chomp $port;
print "$port\n";
您可以使用核心模块中的trim删除任何不需要的周围空白:
您的问题之一是不需要使用任何外部命令来执行您正在执行的操作。停留在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==";
from:您实际上可以咀嚼任何左值,包括赋值:
所以你想要:
chomp($port_number =`$cmd`);
请在chomp中提供代码。你说它不工作是什么意思?你已经在这个网站上呆了足够长的时间,知道如何正确地提问。实际上问题是:port_no变量有backword字符,并且输出被覆盖。backword字符是什么?您能演示如何使用十六进制表示您得到的字符串吗?string::Util不是一个核心模块。如果我们要安装一个CPAN模块,我们最好使用一个做得最好的:String::Strip。请参阅@daxim:Module::CoreList,它告诉我String::Util从5.00x开始就在perl中;也许我对其结果的解释不正确。您错了:Scalar::Util≠ 字符串::Util@joe:…你还没有清楚地说明。帮助其他人以便他们能够帮助您。在以后的Perl 5.10中,您可以使用\R字符类来匹配通用的行结尾。那就是s/\R+\z/;亲爱的,我现在不知道。但我想最好是安全的一面,因为5.8仍然很受欢迎。
chomp($port_number =`$cmd`);