跳出循环Perl

跳出循环Perl,perl,loops,Perl,Loops,我有两个数组,我用另一个数组来计算一个数组的值。我所做的是 @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"; } } 在这里,问题是,在数组_x中,它的第一个索引,即1-(-3)=4

我有两个数组,我用另一个数组来计算一个数组的值。我所做的是

@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";
    }
}

在这里,问题是,在数组_x中,它的第一个索引,即1-(-3)=4,它满足,但下一个1-4=-3不满足条件,因此它应该打破循环并转到数组_x的下一个元素。这里只有5和6满足数组y的所有元素的条件,所以我应该在输出中只得到5,6。

不确定您需要什么,但这是您想要的吗

#!/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

可以标记每个循环并退出所需的循环。看

例如:

行:while(){
最后一行if/^$/##在完成标题时退出
#...
}

如果只是想在后续列表中查找大于元素的元素,那么下面将在每个数组的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

这是带标签的循环,您可以切换到外部级别:

XVALUE:
foreach $x (@array_x){
    YVALUE:
    foreach $y (@array_y){
        if ($x-$y > 0){
            next XVALUE;
        }
        print "$x\n";
    }
}
订正答复:

#!/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";
 }

我想你应该重新考虑一下你的方法。您希望在
@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;
或者因为我对新的
状态
关键字非常着迷:

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的概念相同,尽管我认为此实现更具自文档性/可读性。

use List::Util'max'
my$max\u y=max@array\u y不,我不需要更大的值,我的问题是,如果在第一步中不满意,则跳过检查其他元素,然后转到下一个元素。@gthm:这就是您将得到的结果。我更改了答案以实现您似乎描述的算法。如果OP对跳出外循环比测试更感兴趣,那么这就是正确答案。谢谢,但我的目的是学习跳出循环,而不是寻找最大数。
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;