比较不同数组的范围值

2024-03-08

我正在尝试将 @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";
            }   
        }
    }   
}
}

请注意,您的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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较不同数组的范围值 的相关文章

随机推荐