Что означает цикл for(;;) (2 точки с запятой)?

Я работаю над сценарием для программы VoIP Freeswitch. Сценарий будет работать как экземпляр, прослушивающий входящие сообщения в сокет.

Для начала я использовал пример сценария, поставляемый с Freeswitch, и все работает нормально.

Однако один момент меня сбивает с толку.

use IO::Socket::INET;
use warnings;
use strict;


my $sock = new IO::Socket::INET ( LocalHost => '127.0.0.1',  LocalPort => '8060',  Proto => 'tcp',  Listen => 1,  Reuse => 1 );
die "Could not create socket: $!\n" unless $sock;


for(;;) {
    my $new_sock = $sock->accept();
    my $pid = fork();
    if ($pid) {
      close($new_sock);
      next;
    } 
    close($new_sock); 
}

Что именно означает ;;? Это специальный оператор, который определяется при создании сокета? Пытаюсь найти документы!


person BIGMOOSE    schedule 13.04.2014    source источник
comment
Это просто означает зацикливаться навсегда.   -  person Mark Setchell    schedule 13.04.2014
comment
for (;;) { ... }, while () { ... } и , while (1) { ... } одинаково компилируются в бесконечный цикл. С другой стороны, { ... } компилируется в цикл, который выполняется только один раз. Вы можете использовать next, last и redo с этими петлями (даже { ... }), как и со всеми другими петлями.   -  person ikegami    schedule 13.04.2014
comment
Syntax::Feature::Loop добавляет loop { ... }, что делает то же самое.   -  person ikegami    schedule 13.04.2014
comment


Ответы (3)


for(;;) — это идиома C-ish, которая читается как for ever, и представляет собой цикл, который никогда не заканчивается. Люди, которые не пришли из C, вместо этого напишут while (1).

Обычно этот цикл for в стиле C состоит из трех операторов: инициализация, условие цикла и некоторый шаг:

for (init; condition; step) {
    body;
}

что точно эквивалентно

{
    init;
    while (condition) {
        body;
    }
    continue {
        step;
    }
}

Пустое condition считается всегда истинным.

Обычным использованием будет перебор всех чисел в диапазоне:

for (my $i = 0; $i < @array; $i++) {
    say $array[$i];
}

Однако это было бы более идиоматически записано с циклом foreach:

for my $i (0 .. $#array) {
    say $array[$i];
}

or

for my $item (@array) {
    say $item;
}

Вот почему вы очень редко видите цикл for в стиле C в идиоматическом коде Perl.

Эта конструкция описана в perldoc perlsyn.

person amon    schedule 13.04.2014
comment
написано более идиоматически, предполагая, что scalar(@array) не изменится - person ysth; 13.04.2014

Это просто бесконечный цикл, эквивалентный написанию while(1).

Это работает, потому что в Perl есть цикл for в стиле C с тремя параметрами: инициализация, условие и выражение, которое должно выполняться в каждом цикле.

Обычно это будет что-то вроде for(x=0; x<10; x++), что означает «инициализировать x до 0, проверить, меньше ли x 10, и увеличивать x каждый раз в цикле».

Хитрость заключается в том, что все три являются необязательными, поэтому for(;;) означает "ничего не инициализировать, ничего не тестировать и ничего особенного не делать в конце цикла".

person IMSoP    schedule 13.04.2014
comment
В Perl нет true языкового слова - person Borodin; 14.04.2014
comment
@Borodin Fair point; Какое-то время я немного запутался, о каком языке идет речь. Исправлено сейчас. - person IMSoP; 14.04.2014

это просто бесконечный цикл, как в случае с языком программирования Си. Ваш код застрянет в этом операторе на вечность... или, в вашем случае, выполните блок for до тех пор, пока программа не будет завершена вручную.

person Shubham Maheshwari    schedule 13.04.2014