perl - 为什么这不会永远运行?

标签 perl for-loop constants infinite-loop

我在看一个相当不确定的question关于当你想进行无限循环时最好使用 for(;;) 还是 while(1),我在 C 中看到了一个有趣的解决方案,你可以 #define “EVER”作为常数等于“;;”并从字面上循环 for(EVER) .

我知道定义一个额外的常量来做到这一点可能不是最好的编程实践,但纯粹是为了教育目的,我想看看这是否也可以用 Perl 来完成。

我试图使 Perl 等效,但它只循环一次然后退出循环。

#!/usr/bin/perl -w

use strict;
use constant EVER => ';;';

for (EVER) {
    print "FOREVER!\n";
}

输出:
FOREVER!

为什么这在 perl 中不起作用?

最佳答案

C 的预处理器常量与大多数语言中的常量非常不同。

一个普通的常量就像一个只能设置一次的变量;它有一个值,可以在变量可以存在的大多数地方传递,你和编译器知道它不会改变有一些好处。这是 Perl's constant pragma 的常量类型。给你。当您将常量传递给 for运算符,它只是将其视为一个字符串值,并据此行事。

然而,C 有一个在编译器甚至看到代码之前运行的步骤,称为预处理器。这实际上是在不知道或不关心其中大部分含义的情况下操纵源代码的文本,因此可以执行您在语言本身中无法完成的各种事情。在 #DEFINE EVER ;; 的情况下,你告诉预处理器替换每一次出现的EVER;; ,这样当实际编译器运行时,它只会看到 for(;;) .你可以更进一步,定义forever这个词。如for(;;) ,它仍然可以工作。

正如 Andrew Medico 在评论中提到的,最接近 Perl 的预处理器是 source filters。 ,并且手册中的示例之一确实是模拟 #define .这些实际上比预处理器宏更强大,允许人们编写诸如 Acme::Bleach 之类的模块(用空格替换整个程序,同时保持功能)和 Lingua::Romana::Perligata(解释用语法正确的拉丁语编写的程序) ,以及更明智的功能,例如为类和方法声明添加关键字和语法。

关于perl - 为什么这不会永远运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27049355/

相关文章:

mysql - Perl:将 $dbh 交给模块。安全性和性能?

perl - 在 Perl 中,如何从散列中获取任意值?

javascript - 比较数组中的相邻元素并选择每对中较小的一个

c - 使用指针打印二维数组时出错

c++ - 各种变量的一个标题

c - 从指向 const 的指针中删除 const 是否遵循 C 中的严格别名,并引用同一个对象?

java - 字符串常量中的参数

perl - 是否有比较可用于在 Perl 中开发 Web 应用程序的不同框架的功能的列表?

xml - 在 @INC 中找不到 XML/LibXML/Element.pm

java - for循环未满足?