2012-01-10 6 views
3

私は2つの配列を持っています。私は他の配列と1つの配列の値を評価しています。私は何を行っていることはここループ外に出る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

例えばを参照:

3
LINE: while (<STDIN>) { 
    last LINE if /^$/; # exit when done with header 
    #... 
} 

意図は単に後続リストの要素より大きい要素を見つけることである場合、以下は各アレイの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

'List :: Util 'max';' 'my $ max_y = max @array_y;' –

4

ラベルを使用してループです:

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

OPが問題のテストよりも外側のループを中断することに興味があるなら、これは正解です。 –

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

+0

@gthm:それで結局は終わりでしょう。あなたが説明しているようなアルゴリズムを実装するために私の答えを変更しました。 – flesk

+0

ありがとうございます。それは助けになった。 – gthm

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と同じ概念であります - ドキュメント化/読み込みが可能です。

+0

ありがとうございますが、私の目的は最大数を見つけるのではなく、ループをスキップすることについて学ぶことです。 – gthm

関連する問題