PERL Область применения в циклах foreach - PullRequest
1 голос
/ 23 марта 2011

У меня вопрос по Perl.

use strict;
use warnings;

our @cycles = (0,1,2,3,4);

foreach my $cycle (@cycles){
    my $nextcycle = 0;
    foreach $nextcycle (@cycles){
        if ($cycle+1 == $nextcycle){
            print "found cycle+1, $nextcycle\n";
            last;
        }
    }
    print "current=$cycle, nextcycle=$nextcycle\n";
}

Вывод, который я получаю:

найденный цикл + 1, 1

текущий = 0, следующий цикл = 0

найденный цикл+1, 2

текущий = 1, следующий цикл = 0

найденный цикл + 1, 3

текущий = 2, следующий цикл = 0

найденный цикл+1, 4

current = 3, nextcycle = 0

current = 4, nextcycle = 0

Я ожидал этого:

найденный цикл + 1, 1

текущий = 0, следующий цикл = 1

найденный цикл + 1, 2

текущий = 1, следующий цикл = 2

найденный цикл + 1, 3

текущий = 2, следующий цикл = 3

найденный цикл + 1, 4

текущий = 3, следующий цикл = 4

current = 4, nextcycle = 0

Я изменил цикл так, чтобы он выглядел следующим образом, и получил то, что хотел:

use strict;
use warnings;

our @cycles = (0,1,2,3,4);

foreach my $cycle (@cycles){
    my $nextcycle = 0;
    foreach my $tempcycle (@cycles){
        if ($cycle+1 == $tempcycle){
            $nextcycle = $tempcycle;
            print "found cycle+1, $nextcycle\n";
            last;
        }
    }
    print "current=$cycle, nextcycle=$nextcycle\n";
}

Я хочу знать, почему первый циклне работал!

Ответы [ 2 ]

9 голосов
/ 23 марта 2011

Из руководства Perl по конструкции foreach :

Цикл foreach выполняет итерацию по обычному значению списка и устанавливает переменную VAR в качестве каждого элемента спискав очереди.Если переменной предшествует ключевое слово my, то она имеет лексическую область видимости и поэтому видна только внутри цикла.В противном случае переменная неявно является локальной для цикла и восстанавливает свое прежнее значение при выходе из цикла.

2 голосов
/ 23 марта 2011

Область действия переменной в foreach my ... представляет собой сам цикл foreach.От perldoc perlsyn:

Существует одно незначительное отличие: если переменные объявляются с my в разделе инициализации for, лексическая область действия этих переменных - точно forпетля (тело петли и управляющих секций).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...