我试图将@ 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";
}
}
}
}
}
答案 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{$_}
}