2013-06-02 62 views
1

我試圖創建下面的數組:如何創建正則表達式匹配的數組

@domains = ("lmcaster.espn.go.com", "gomailfileus.go.com"); 

我與使用正則表達式嘗試,但我不是成功的填充陣列。我很確定我的正則表達式部分已經搞亂了。這裏是我的代碼到目前爲止:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $dns_output = <<END; 
199.181.132.138 lmcaster.espn.go.com (300) 
199.181.132.133 gomailfileus.go.com (300) 
END 

my @domains = ($dns_output =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\s([[:graph:]])\s[[:graph:]]/); 

for my $d (@domains) { 
     print "Domain: $d\n"; 
} 

有人請指出我做錯了什麼?

回答

3

你忘了添加/g改性劑,第一,並添加+量詞等全域(而不僅是其第一個符號)將被捕獲,第二。

my @domains = $dns_output =~ /(?:[0-9]+\.){3}[0-9]+\s*([[:graph:]]+)/g; 

我已經壓縮IP,以及在這裏分組,並增加*量詞來\s分離領域。

+0

完美地工作。我還學會了如何減少代碼,使用+和當然/ g.Thank :) –

1
my @domains = $dns_output =~ /^ \d+[.]\d+[.]\d+[.]\d+ \s+ (\S+) /xmg; 
+0

呵呵@mpapec,這是你提供一些代碼的答案之一,但沒有提供你的修改的理由或解釋。有些方面純粹是風格化的('[。]'而不是'\ .';'/ x')。一些修改可能以不相關的方式修改含義(錨定在行首,'\ d'匹配比[[0-9]'多的字符,'\ S'匹配多於'[[:graph:]]')。最後,只添加'/ g'和'+'運算符是相關的。用於反饋的@amon tnx – amon

+0

;輸入數據看起來簡單/簡單,所以我選擇了更寬鬆的方法。 –