我正在学习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";
这适用于“使用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.
但是,如果我在变量的第一个实例之前放置“my”,它仍然不会运行,但原因不同:
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”,所以我很困惑。
感谢。
答案 0 :(得分:13)
从v5.12开始,如果你说use VERSION
没有别的,它会自动打开strict。由于在“子程序”一章之前我们没有涵盖您的特定问题的方法,因此我们在前面的章节中没有做任何要求您这样做的事情。
学习Perl 是作为教程设计的,所以我们希望在我们明确向您展示之前,您不会在程序中执行任何操作。这样,我们就不必在第一章解释所有的Perl。
在我使用需要它的功能之前,我倾向于不使用任何版本声明,我们在开头的章节中没有这样做。
本书其余部分祝你好运。 :)
答案 1 :(得分:5)
我想在该版本之后它会自动启用use strict
模式,这会强制您声明每个变量的范围。 (这通常是一件好事,它使你很难发现错误)。
您可能会收到$sum
错误,因为我猜您将my $sum
放在while
循环中,因此它超出了最终打印语句的范围。
您希望在while循环之前和之外设置my $sum = 0;
,以便它保持while循环之外的范围。如果在while循环中声明sum
,则该值将在循环的每次迭代后过期并重置,并且在您尝试打印时它将不存在。
答案 2 :(得分: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";