2012-03-14 92 views
2

我有2門陣列(@system@reserve)。每個包含一個數字列表,我想比較和拼接(可能?)@reserve中匹配@system中的數字的數字。比較2個陣列和除去比賽

我已經嘗試了一些響應的發現和拼接的問題在那裏,但他們似乎並不奏效。使用Perl 5.12.4。

@reserve中的數字始終爲11000..136000,系統中的數字始終在@system範圍內,但會有所不同。我一直專注於代碼如下:

my @system = query(); 
my @reserve = 11000..136000; 

foreach my $num (@system) { 
my $index = 0; 
$index++ until $reserve[$index] eq $num; 
splice (@reserve,$index,1); 
} 

查詢()只是要求系統(PBX)的號碼清單,並將其推入@system

任何幫助表示讚賞。

感謝,

馬蒂

+0

雖然這個問題使用散列鍵作爲一個集合可以更好地解決,在編程點上,你的內部循環可能是冒險的因爲如果'$ num'沒有出現在'@ reserve'中,它可能會掛起。此外,您的值似乎是數字,但您使用'eq',* string *等號運算符來比較它們。 – zgpmax 2012-03-14 16:18:34

回答

3

您不必在使用,而不是hashslice與splice工作:

my @system = query(); 

my %reserve ; 
@reserve{(11000..136000)} = undef ; 

delete @reserve{@system} ; 
my @list_of_reserve = sort { $a <=> $b } keys %reserve ; 
+0

虛幻。謝謝。很棒。 – 2012-03-14 20:09:50

1

如何:

my @system = query(); 
my @reserve = 11000..136000; 
my %tmp = map{$_ => 1}@system; 
@reserve = grep{!exists $tmp{$_}}@reserve;