2014-10-11 53 views
0

我有以下代碼。我試圖從@ arr2和@ arr4中打印所有常見值而不重複。預期產出應爲5,6,7,8,9,13,14,15,16,17,18。我沒有得到如何在循環中放置條件以避免重複以及爲什麼$ i不在此代碼中打印。如何在不重複的情況下打印兩個不同重疊範圍的公用值

#!/usr/bin/perl 
my @arr2 = (1 .. 10, 5 .. 15, 10 .. 20); 
my @arr4 = (5 .. 9, 13 .. 18); 

foreach my $line1 (@arr2) { 
    my ($from1, $to1) = split(/\.\./, $line1); 
    #print "$to1\n"; 
    foreach my $line2 (@arr4) { 
     my ($from2, $to2) = split(/\.\./, $line2); 
     for (my $i = $from1; $i <= $to1; $i++) { 
      for (my $j = $from2; $j <= $to2; $j++) { 
       if ($i == $j) { 
        print "$i \n"; 
       } 
      } 
     } 
    } 
} 

回答

1

瞭解您的問題的第一步是瞭解您的數據 - 數組並不包含您認爲他們持有的內容。

#!/usr/bin/perl 
my @arr2=(1..10,5..15,10..20); 
my @arr4=(5..9,13..18); 

print "arr2: @arr2\n"; 
print "arr4: @arr4\n"; 

的輸出是這樣的:

arr2: 1 2 3 4 5 6 7 8 9 10 5 6 7 8 9 10 11 12 13 14 15 10 11 12 13 14 15 16 17 18 19 20 
arr4: 5 6 7 8 9 13 14 15 16 17 18 

這說明你的代碼試圖在..是要失敗的可怕分裂的字符串。

最基本的調試技巧之一是打印出您實際獲得的數據,以確保它與您認爲應該具有的內容相符。在這裏,基本打印會顯示輸入數據不符合您的預期格式。

+0

子內容也可以寫爲'打印 「$名:@arr \ n」;' – 2014-10-11 19:56:10

+1

像評論說,TMTOWTDI 。但我同意。 – 2014-10-11 19:57:43

2

正如Jonathan指出的那樣,您似乎誤解了數據的本質,因爲您不認識用於構造列表的Range Operator ..

my @array = (1 .. 10); 
print "@array\n"; 

輸出

1 2 3 4 5 6 7 8 9 10 

一旦你認識到這一點,那麼你只需要指出以下幾點:

結合形成:

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

my @arr2 = (1 .. 10, 5 .. 15, 10 .. 20); 
my @arr4 = (5 .. 9, 13 .. 18); 

my %seen; 
$seen{$_}++ for uniq(@arr2), uniq(@arr4); 

my @intersection = sort { $a <=> $b } grep { $seen{$_} == 2 } keys %seen; 

print "@intersection\n"; 

sub uniq { 
    my %seen; 
    $seen{$_}++ for @_; 
    return keys %seen; 
} 

輸出:

5 6 7 8 9 13 14 15 16 17 18 
相關問題