您可以跳出(标记的)循环。请注意,您的代码是错误的,因为数组是从零开始索引的。你想从 to 循环0
,$#array
而不是从1
to$#array + 1
循环scalar @array
(除非你摆弄某些变量)。
my $found_same = 0;
my ($x, $y) = @array[0, 1]; # $x, $y are arrayrefs we want to loop over
my ($x_i, $y_i);
INDEX:
for $x_i (0 .. $#$x) {
for $y_i (0 .. $#$y) {
if ($x->[$x_i] == $y->[$y_i]) {
$found_same = 1;
last INDEX;
}
}
}
say "found same value $x->[$x_i] at indices $x_i, $y_i" if $found_same;
如果您对索引不感兴趣,仅在存在相同值的情况下,您应该遍历这些值:
my $found_same = 0;
my ($x, $y) = @array[0, 1];
INDEX:
for my $x_val (@$x) {
for my $y_val (@$y) {
if ($x_val = $y_val) {
$found_same = 1;
last INDEX;
}
}
}
say "found some same value" if $found_same;
如果我们把它写成一个函数,我们可以去掉丑陋的变量重新赋值,并且可以return
打破循环:
my $find_same = sub {
my ($x, $y) = @_;
for my $x_val (@$x) {
for my $y_val (@$y) {
return 1 if $x_val == $y_val;
}
}
return 0;
};
say "found some same value" if $find_same->(@array[0, 1]);
在 的帮助下List::MoreUtils
,有一个很短的方法可以写这个:
use List::MoreUtils 'any';
my ($x, $y) = @array[0, 1];
say "found some same value" if any { my $val = $_; any { $val == $_ } @$y } @$x;
所有这些解决方案都假设您只有数字数据。