请注意,您的for
像这样循环
for (my $i = $from1; $i = $to1; $i++) { ... }
不正确,因为第二个子句$i = $to1
应该是一个test确定循环是否应该继续,而你是指派的价值$to1
to $i
所以循环永远不会结束如果$to1
是真的。我想你的测试未能完成?
我还认为你误解了范围运算符 ..
作品。像这样的表达2..5
返回一个list由 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
)
所以没有必要使用split
在数组值上,因为它们已经为您扩展了,并且值 5 和 10 在输出中出现两次的原因是因为它们在输入中也存在两次。
如果您想查找其中的所有唯一值both数组,您可以依赖中的值@arr4
是唯一的(即没有像@arr3
)然后你可以编写类似下面的代码。但如果both数组可能有重叠,那么您必须显式删除重复项,并且已经发布了使用散列来执行此操作的解决方案。
该解决方案使用label V4
所以这样next
可以进入下一个迭代outer环形。没有它,其余的@arr3
即使找到匹配项后也会扫描匹配项。
use strict;
use warnings;
my @arr3 = (1..5, 5..10, 10..15);
my @arr4 = (3..7, 9..12, 14..17);
V4:
for my $v4 (@arr4) {
for my $v3 (@arr3) {
if ($v3 == $v4) {
print "$v3\n";
next V4;
}
}
}
output
3
4
5
6
7
9
10
11
12
14
15