Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Как выйти из вложенных foreach


Автор: Suppir 11.3.2012, 08:22
Как из вложенного foreach сделать "next" для внешнего?

Код

foreach $x(keys %a){
        
    foreach $i (keys %iskl){
        if ($x=~ /$i/){
            #как сделать next для внешнего foreach?
        }
    }
    
    if (! exists $b{$x}){
        print OU "$a{$x}\n"
    }
}


Добавлено через 2 минуты и 7 секунд
В некоторых языках программирования можно написать "next 2" - тогда осуществляется next для внешнего цикла. 

Автор: vadiml 11.3.2012, 09:36
Вы документацию недочитали, раздел меток:

Код

EXT: foreach $x(keys %a){
        
    INT: foreach $i (keys %iskl){
        if ($x=~ /$i/){
            next EXT;
        }
    }
    
    if (! exists $b{$x}){
        print OU "$a{$x}\n"
    }
}

Автор: alezzz 11.3.2012, 09:58
а чем плох вариант без меток:
Код

foreach $x(keys %a){      
    foreach $i (keys %iskl){
        last if $x=~ /$i/;
    }    
    if (! exists $b{$x}){
        print OU "$a{$x}\n"
    }
}

Автор: vadiml 11.3.2012, 10:12
alezzz

В Вашем варианте выполнится 2й if,
для last надо код переписать

Автор: Suppir 11.3.2012, 10:16
vadiml
Метки - это ж вроде GOTO, считается плохим стилем smile
А без меток как-то можно реализовать?


alezzz 
в этом случае last сработает для внутреннего блока. А мне нужно, чтобы дальнейшая обработка этого $x не проводилась, т.е. сделать next для внешнего блока.

Автор: vadiml 11.3.2012, 11:34
Suppir

Плохой стиль -- это нерациональное использование goto, когда это ухудшает читаемость кода.

Если хотите описание что стоит делать, а что нет, найдите книгу Алена Голуба "Правила программирования" (есть скан в инете). Хоть там примеры на С, но всё описанное относится к большиству языков программирования.

> А без меток как-то можно реализовать?

Без изменения логики кода -- нет.
Посмотрите на блок continue.


Автор: Suppir 11.3.2012, 12:43
ok, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)