"学习Perl"中的某些程序第6版.不使用"使用5.014" - 为什么?

Mar*_*ler 5 perl

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

#!/usr/bin/perl

#use 5.014;

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

这与"使用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.
Run Code Online (Sandbox Code Playgroud)

但是,如果我在变量的第一个实例之前放置"my",它仍然不会运行,但原因不同:

Global symbol "$sum" requires explicit package name at ch3loop.pl line 10.
Execution of ch3loop.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

bri*_*foy 13

从v5.12开始,当你说use VERSION别的时候,它会自动开启严格.由于在"子程序"一章之前我们没有涵盖您的特定问题的方法,因此我们在前面的章节中没有做任何要求您这样做的事情.

学习Perl是作为教程设计的,因此我们希望在我们明确向您展示之前,您不会在程序中执行任何操作.这样,我们就不必在第一章解释所有的Perl.

在我使用需要它的功能之前,我倾向于不使用任何版本声明,我们在开头的章节中没有这样做.

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

  • @Mark - 如果您可能错过了它,为了完全透明,请将回答此问题的用户的名字与"Learning Perl"封面上的作者列表相匹配:) (5认同)

Tim*_*Tim 5

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

你可能会得到$sum错误,因为我猜你把my $sum里面while循环,所以它是超出范围在最后的print语句.

您希望my $sum = 0;在while循环之前和之外设置,以便它在while循环之外保持范围.如果sum在while循环内部声明,则该值将在循环的每次迭代后过期并重置,并且在您尝试打印时它将不存在.