2014-10-11 25 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 
相关问题