如何从两个不同的重叠范围打印常用值而不重复

时间:2014-10-11 19:35:39

标签: perl

我有以下代码。我试图从@ 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";
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

这表明您尝试在..上拆分字符串的代码将会失败。

最基本的调试技术之一是打印出您实际获得的数据,以确保它与您认为应该拥有的数据相匹配。在这里,基本打印会显示输入数据不是您期望的格式。