2010-05-14 44 views
-5

我捕獲從一個外部程序的一些輸出:如何從輸出中修剪空白並用Perl中的反引號捕獲?

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

請提供chomp代碼。 「它不工作」是什麼意思?你已經在這個網站上了解了如何正確地提出問題。 – Ether 2010-05-14 16:28:26

+0

事實上,問題是:port_no變量具有後退字符並且輸出覆蓋。 – joe 2010-05-14 17:07:51

+0

什麼是「後衛」角色?你可以使用十六進制表示你得到的字符串嗎? – 2010-05-14 22:45:42

回答

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=="; 
2

可以去除所有的空白與此:

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

這解決了我的問題 – joe 2010-05-14 16:49:33

+2

@joe:......你還沒有清楚說明。幫助別人,讓他們能夠幫助你。 – Ether 2010-05-14 17:08:59

-1

chomp僅刪除最後一個換行符。嘗試這樣的正則表達式:

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

在稍後的Perl 5.10中,可以使用匹配廣義行尾的'\ R'字符類。那會是\ \ R + \ z //;' – 2010-05-14 22:44:11

+0

甜,現在不是那個。但是我想最好能成爲一個安全的方面,因爲5.8仍然很受歡迎。 – jkramer 2010-05-15 00:30:25

2

我要去這裏嘗試瞭解你的心思,並找出你的「它不工作」的意思,通過指向您的文檔chomp

這個更安全的「chop」版本刪除任何對應於$ /(在 「English」模塊中被稱爲$ INPUT_RECORD_SEPARATOR)當前值的尾隨字符串。 它返回從其所有參數中刪除的字符總數。

要正確地使用它(假設您想要的字符串,而不是換行的其餘部分),不佔用其返回值:

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

您可以除去任何不需要周圍的空白與trim核心模塊String::Util

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

'String :: Util'不是核心模塊。如果我們要安裝一個CPAN模塊,我們不妨使用最好的工作:'String :: Strip'。見http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1。html – daxim 2010-05-14 16:52:22

+0

@daxim:Module :: CoreList告訴我String :: Util從5.00x開始已經在perl中;也許我錯誤地解釋了它的結果。 – Ether 2010-05-14 17:08:11

+1

你錯了:'Scalar :: Util'≠'String :: Util' – daxim 2010-05-14 19:45:29

3

perldoc:「實際上,你可以的Chomp任何是左值,其中包括工作分配:」

所以你要:

chomp($port_number =`$cmd`);