2012-01-10 62 views
3

我有两个数组,我正在评估其他数组的值。我所做的是走出循环Perl

@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未满足条件,因此它应该打破循环并转向array_x的下一个元素。这里只有5和6满足array_y所有元素的条件,所以我应该只在输出中得到5,6。

回答

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 
3

您可以把每个循环和退出一个你想要的。见perldoc last

例如为:

LINE: while (<STDIN>) { 
    last LINE if /^$/; # exit when done with header 
    #... 
} 
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

'use List :: Util'max';''my $ max_y = max @array_y;' – 2012-01-10 13:45:58

4

这里是标签的循环,所以你可以断开与外部级:

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

如果OP对测试有兴趣的话,那么这是正确的答案。 – 2012-01-10 15:40:50

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"; 
} 
+0

不,我不需要更大的值,我的概率是跳过检查其他如果它不满足在第一步本身,并转到下一个元素。 – gthm 2012-01-10 13:54:50

+0

@gthm:这就是你最终会做到的。我改变了我的答案来实现你似乎正在描述的算法。 – flesk 2012-01-10 15:42:18

+0

谢谢。它有帮助。 – gthm 2012-01-11 05:26:47

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,但我认为这个实现更多的自我-documenting /读取。

+0

谢谢,但我的目标是了解跳过循环,而不是找到最大数量。 – gthm 2012-01-11 05:26:11