2013-08-19 24 views
0

我在我的程序中有以下代碼,其目的是返回安裝的Debian的版本和顛覆。 shell的輸出被變量讀取並解析並形成一個字符串。如何在最後刪除特殊字符?

#!/usr/bin/perl 
use warnings; 
use strict; 
use Scalar::Util qw(looks_like_number); 
chomp(my $distver=`cat /etc/issue`); 
$distver =~ s/\\n//g; 
$distver =~ s/\\/./g; 
$distver =~ s/ //g; 
our $enpos=-1; 
for (my $i=0; $i <length($distver); $i++) { 
    if (looks_like_number(substr($distver, $i, 1))) { 
     if ($enpos == -1) { $enpos = $i; } 
    } 
} 
print "Distro:".substr($distver, 0, $enpos)."".substr($distver, $enpos); 
my $subver=substr($distver, $enpos); 
$subver =~ s/\\n//g; 
$subver =~ s/\\r//g; 
$subver =~ s/\\f//g; 
print "Subversion:".$subver."\n"; 

的上述的輸出是:

[email protected]:~# ./distr.pl 
Distro:DebianGNU/Linux7.l 
Subversion:7.l 

在輸出中,有在端部的附加的換行,7.1後。我嘗試過上述正則表達式,試圖在最後刪除換行符,返回並換行形式,但失敗了。

cat /etc/issue的輸出是this

我最初試圖格格從輸出除去換行,發現不是刪除結束換行符,它這樣做:

print "Distro:".substr($distver, 0, $enpos)."".substr($distver, $enpos); 
my $subver=chomp(substr($distver, $enpos)); 
print "Subversion:".$subver."\n"; 

輸出:

[email protected]:~# ./distr.pl 
Distro:DebianGNU/Linux7.l 
Subversion:1 
[email protected]:~# 

那麼,爲什麼會出現這種情況?爲什麼chomp(和chop)會比新行更多地切斷?爲什麼這個額外的換行符被輸出?

回答

3

chomp更改字符串就位後,它不返回已更改的字符串,而是刪除了字符數。

要刪除換行符,請使用s/\n//g,雙反斜槓匹配反斜槓。

+0

你能告訴我爲什麼正則表達式不起作用嗎? – Droidzone

+0

你可以發佈/ etc/issue的內容嗎? – choroba

+0

http://pastebin.com/T3HP6hD8 – Droidzone

0

試試這樣說:

$ distver =〜S/\ N * // S;。