我有以下代码。我试图从@ 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";
}
}
}
}
}
答案 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
这表明您尝试在..
上拆分字符串的代码将会失败。
最基本的调试技术之一是打印出您实际获得的数据,以确保它与您认为应该拥有的数据相匹配。在这里,基本打印会显示输入数据不是您期望的格式。