【问题标题】:What does the for(;;) (2 semi colons) loop mean?for(;;) (2 个分号) 循环是什么意思?
【发布时间】:2014-04-13 18:37:59
【问题描述】:

我正在为 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); 
}

;; 到底是什么意思?它是在创建套接字时定义的特殊运算符吗?努力寻找文档!

【问题讨论】:

  • 它只是意味着永远循环。
  • for (;;) { ... }, while () { ... } 和 , while (1) { ... } 编译成一个“无限”循环。另一方面,{ ... } 编译成只执行一次的循环。您可以在这些循环中使用nextlastredo(甚至是{ ... }),就像所有其他循环一样。
  • Syntax::Feature::Loop 添加loop { ... },其作用相同。

标签: perl freeswitch


【解决方案1】:

for(;;) 是一个 C-ish 习惯用法,读作for ever,是一个永不终止的循环。不是来自 C 的人会写 while (1)

通常,这个 C 风格的 for 循环包含三个语句:初始化、循环条件和某个步骤:

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];
}

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

这就是为什么在惯用的 Perl 代码中很少看到 C 风格的 for 循环的原因。

此构造记录在perldoc perlsyn

【讨论】:

  • “写得更惯用”假设scalar(@array) 没有改变
【解决方案2】:

只是一个无限循环,相当于写while(1)

之所以有效,是因为 Perl 有一个 C 风格的 for 循环,其中包含三个参数:初始化、条件和要在每个循环上执行的表达式。

通常,这类似于for(x=0; x&lt;10; x++),意思是“将x 初始化为0,测试x 是否小于10,并在每次循环中递增x”。

诀窍在于这三个都是可选的,所以for(;;) 的意思是“不初始化,不测试,并且在循环结束时不做任何特别的事情”。

【讨论】:

  • Perl 中没有true 语言字
  • @Borodin 公平点;一段时间以来,我对讨论哪种语言感到有些困惑。现已修复。
【解决方案3】:

它只是一个无限循环,就像 C 编程语言一样。 您的代码将永远停留在此语句中.. 或者在你的情况下,执行 for 块直到程序被手动终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2019-03-09
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2015-08-17
    相关资源
    最近更新 更多