2013-04-16 131 views
0

我有須狀行的文件工作,Perl的拆分與逗號

<tag host="xyz|abc" some info /> 
<tag host="ijk,cdf" some info /> 

我通過使用模式匹配得到主機的信息,我想分裂的主機的價值。由於某些原因,即使看起來正確,以下代碼似乎也不適用於逗號。

if($line =~ m/(\s\S)*host=\"(\S+)\"(\s\S)*/) 
{ 
($val) = ($2); 
$val=~tr/!$()//ds; 
my @values; 
if($val =~ m/((\S+)\|(\S+))*/) 
{ 
    @values=split('\|',$val); 
} 
else 
{ 
@values=split(',',$val); 
} 
#Perform some action on Values. 
} 

任何人都可以幫助我嗎?提前致謝。

+0

什麼是您的輸入是什麼樣子? – squiguy

+1

爲什麼把它分解成一個'if-else'?爲什麼不在逗號或管道上分割(例如'split/[,\ |] /,$ val;')? – vol7ron

回答

0

代碼中不需要if-else。您可以將條件組合成一行代碼。

更改您這樣的代碼:

use strict; 
use warnings; 

if($line =~ m/(\s\S)*host=\"(\S+)\"(\s\S)*/) 
{ 
($val) = ($2); 
$val=~tr/!$()//ds; 
my @values; 
@values = split (/[,|]/,$val); 
#Perform some action on Values. 
} 
+1

當然,該代碼不會在嚴格下編譯,因爲它是。並且'$ 1'和'$ 3'的捕獲看起來不需要→'/ host =「([^」] +)「/'是一個更好的正則表達式,這個'split'正則表達式對輸入會產生有趣的結果,比如'host =」 xyz | abc,def「'。將結果片段限制爲兩個,第三個參數指向'split'可能是個好主意。 – amon

+0

非常感謝Kute。 – Ambi

+0

無需在字符類中逃脫管道 – Borodin

2

幾個想法:

  • use strictuse warnings有的縮進將是不錯:)

  • 如果你寫(\s\S)我相信你熟悉JavaScript並且意味着字符類別[\s\S]?沒有必要的文字匹配您有興趣

  • 部分的/s修改器tr///是結合多餘與/d

  • 容易得多前面和後面的只是收集既不是人物的所有子管也不是逗號

這是我怎麼會寫它

use strict; 
use warnings; 

while (my $line = <DATA>) { 
    if ($line =~ m/host="(\S+)"/) { 
     (my $href = $1) =~ tr/!$()//d; 
     my @values = $href =~ /[^,|]+/g; 
     print "@values\n"; 
    } 
} 

__DATA__ 
<tag host="xyz|abc" some info /> 
<tag host="ijk,cdf" some info /> 

輸出

xyz abc 
ijk cdf