我有两个数组,我正在用其他数组评估一个数组的值。我所做的是
@array_x= qw(1 5 3 4 6);
@array_y= qw(-3 4 2 1 3);
foreach $x (@array_x){
foreach $y (@array_y){
if ($x-$y > 0){
next;
}
print "$x\n";
}
}
这里,问题是,在array_x中,它的第一个索引即1 - ( - 3)= 4,它满足,但接下来1-4 = -3不满足条件,因此它应该打破循环并且去array_x的下一个元素。这里只有5和6满足array_y的所有元素的条件,所以我在输出中只得到5,6。
答案 0 :(得分:4)
以下是带有标签的循环,因此您可以突破到外层:
XVALUE:
foreach $x (@array_x){
YVALUE:
foreach $y (@array_y){
if ($x-$y > 0){
next XVALUE;
}
print "$x\n";
}
}
答案 1 :(得分:3)
您可以标记每个循环并退出所需的循环。见perldoc last
E.g:
LINE: while (<STDIN>) {
last LINE if /^$/; # exit when done with header
#...
}
答案 2 :(得分:3)
如果只想找到大于后续列表中元素的元素,则以下内容将在每个数组的1次迭代中找到它。
use strict;
my @array_x= qw(1 5 3 4 6);
my @array_y= qw(-3 4 2 1 3);
my $max_y = $array_y[0];
foreach my $y (@array_y) {
$max_y = $y if $y > $max_y;
}
foreach my $x (@array_x) {
print "\nX=$x" if $x > $max_y;
}
输出:
X=5
X=6
答案 3 :(得分:0)
不确定你需要什么,但这是你想要的吗?
#!/usr/bin/perl
use Modern::Perl;
my @array_x= qw(1 5 3 4 6);
my @array_y= qw(-3 4 2 1 3);
foreach my $x(@array_x){
my $OK=1;
foreach my $y(@array_y){
next if $x > $y;
$OK=0;
last;
}
say "x=$x" if $OK;
}
<强>输出:强>
x=5
x=6
答案 4 :(得分:0)
修改回答:
#!/usr/bin/perl
use strict;
use warnings;
my @array_x= qw(1 5 3 4 6);
my @array_y= qw(-3 4 2 1 3);
LABEL: for my $x (@array_x) {
for my $y (@array_y) {
next LABEL unless $x > $y;
}
print "$x\n";
}
答案 5 :(得分:0)
我想你可能想重新考虑你的方法。您希望@x
中的所有值都大于@y
中的所有值。你不应该每次循环所有@y
,你应该找到它的最大值,然后过滤最大值。
use strict;
use warnings;
use List::Util 'max';
my @x= qw(1 5 3 4 6);
my @y= qw(-3 4 2 1 3);
my $ymax = max @y;
my @x_result = grep { $_ > $ymax } @x;
或者因为我对新的state
关键字感到疯狂:
use strict;
use warnings;
use 5.10.0;
use List::Util 'max';
my @x= qw(1 5 3 4 6);
my @y= qw(-3 4 2 1 3);
my @x_result = grep { state $ymax = max @y; $_ > $ymax } @x;
编辑:在重新阅读之前的答案时,这与angel_007的概念相同,不过我觉得这个实现更具有自我记录/可读性。