走出循环Perl

时间:2012-01-10 10:15:22

标签: 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";
    }
}

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

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的概念相同,不过我觉得这个实现更具有自我记录/可读性。