5

我正在使用 Llama,第 6 版学习 Perl,第一章中的一些程序不适用于“使用 5.014”,我不知道为什么。例如:

#!/usr/bin/perl

#use 5.014;

$n = 1;
while ($n < 10) {
        $sum += $n;
        $n += 2;
}
print "The total was $sum.\n";

这适用于注释掉的“使用 5.014”,但包含它,我收到以下错误:

Global symbol "$n" requires explicit package name at ch3loop.pl line 5.
Global symbol "$n" requires explicit package name at ch3loop.pl line 6.
Global symbol "$sum" requires explicit package name at ch3loop.pl line 7.
Global symbol "$n" requires explicit package name at ch3loop.pl line 7.
Global symbol "$n" requires explicit package name at ch3loop.pl line 8.
Global symbol "$sum" requires explicit package name at ch3loop.pl line 10.
Execution of ch3loop.pl aborted due to compilation errors.

但是,如果我将“我的”放在变量的第一个实例之前,它仍然不会运行,但出于不同的原因:

Global symbol "$sum" requires explicit package name at ch3loop.pl line 10.
Execution of ch3loop.pl aborted due to compilation errors.

有人可以解释发生了什么吗?我知道我可以在没有“使用 5.014”的情况下运行它,但它确实在书的封面上说第 6 版。“涵盖 Perl 5.14”,所以我很困惑。

谢谢。

4

3 回答 3

13

从 v5.12 开始,当你use VERSION什么都不说时,它会自动打开strict。由于在“子程序”一章之前我们不会介绍解决您的特定问题的方法,因此在前面的章节中我们不会做任何需要您这样做的事情。

学习 Perl是作为教程设计的,所以我们希望在我们明确向您展示之前,您不会在程序中做任何事情。这样,我们就不必在第一章中解释所有的 Perl。

在我使用需要它的功能之前,我倾向于不使用任何版本声明,而且我们在开始的章节中不会这样做。

祝本书其余部分好运。:)

于 2012-08-04T07:53:59.440 回答
5

我猜在那个版本之后它会自动启用use strict模式,这会强制你声明每个变量的范围。(这通常是一件好事,它使您不太可能犯难以发现的错误)。

您可能会收到$sum错误,因为我猜您将my $sum其放入while循环中,因此它超出了最终打印语句的范围。

您想my $sum = 0;在 while 循环之前和之外进行设置,以便它保持 while 循环之外的范围。如果你sum在while循环里面声明,这个值会在每次循环迭代后过期并被重置,当你尝试打印它时它不会存在。

于 2012-08-04T02:27:02.960 回答
2

use <version>;默认启用strict。所以像下面这样声明变量 -

#!/usr/bin/perl
use 5.014;
my $sum;
my $n=1;

while ($n < 10) {
        $sum += $n;
        $n += 2;
}
print "The total was $sum.\n";
于 2012-08-04T03:02:20.847 回答