Выход из цикла Perl - PullRequest
       5

Выход из цикла Perl

3 голосов
/ 10 января 2012

У меня есть два массива, я оцениваю значения одного массива с другим.То, что я сделал, это

@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 на выходе.

Ответы [ 6 ]

4 голосов
/ 10 января 2012

Вот ваши петли с метками, чтобы вы могли выйти на внешний уровень:

3 голосов
/ 10 января 2012

Если цель состоит в том, чтобы просто найти элементы, которые больше, чем элемент в следующем списке, следующий найдет его в 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 голосов
/ 10 января 2012

Вы можете пометить каждый цикл и выйти из того, который вы хотите. Смотрите perldoc last

например:.

LINE: while (<STDIN>) {
    last LINE if /^$/; # exit when done with header
    #...
}
0 голосов
/ 10 января 2012

Я думаю, вы могли бы пересмотреть свой метод.Вы хотите найти все значения в @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 голосов
/ 10 января 2012

Исправленный ответ:

#!/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 голосов
/ 10 января 2012

Не совсем уверен, что вам нужно, но вы этого хотите?

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...