比较不同数组的范围值

时间:2014-07-24 12:39:21

标签: perl

我试图将@ arr3的范围值与@ arr4的范围值进行比较,但我没有得到所需的输出。请在下面的代码中建议我修改以获得输出 3,4,5,6,7,9,10,11,12,14,15(不重复值,例如5和10)和总匹配= 11

my @arr3=(1..5,5..10,10..15); 
my @arr4=(3..7,9..12,14..17);

foreach my $line1 (@arr4) {
    my ($from1,$to1)=split/\.\./,$line1;

foreach my $line2 (@arr3) {

    my ($from2,$to2)=split/\.\./,$line2;

    for (my $i=$from1;$i=$to1 ;$i++) {
        for (my $j=$from2;$j=$to2 ;$j++) {
            if ($i==$j) {

                print "$i";print "\n";
            }   
        }
    }   
}
}

2 个答案:

答案 0 :(得分:1)

请注意您的for循环

for (my $i = $from1; $i = $to1; $i++) { ... }

不正确,因为第二个子句$i = $to1应该是 test 来确定循环是否应该继续,而你分配的值{{ 1}}到$to1所以如果$i为真,循环将永远不会结束。我想你的测试未能完成?

我也认为你误解了范围运算符 $to1的工作方式。像..这样的表达式会返回一个列表,其中包含从2到5的所有值,并且与2..5相同。

所以你的数组初始化

(2, 3, 4, 5)

相同
my @arr3 = (1..5, 5..10, 10..15)

所以没有必要对数组值使用my @arr3 = ( 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15 ) 因为它们已经为你扩展了,并且值5和10在输出中出现两次的原因是因为它们也存在两次输入。

如果要查找两个数组中的所有唯一值,并且可以依赖split中唯一的值(即没有重叠,就像{ {1}})然后你可以写下面的代码。但是如果两个数组都有重叠,那么你必须明确地删除重复项,并且使用散列的解决方案已经发布了。

此解决方案使用标签 @arr4,以便@arr3可以转到外部循环的下一次迭代。如果没有它,即使找到一个,V4的其余部分也会被扫描以进行匹配。

next

<强>输出

@arr3

答案 1 :(得分:0)

使用哈希:

my @arr3 = (1..5, 5..10, 10..15); 
my @arr4=(3..7, 9..12, 14..17);

my (%nums1, %nums2);

$nums1{$_} = 1 foreach(@arr3);
$nums2{$_} = 1 foreach(@arr4);

foreach (sort { abs $a <=> abs $b} keys %nums1){
    print "$_\n" if exists $nums2{$_} 
}