【问题标题】:Certain programs in "Learning Perl" 6th ed. don't work with "use 5.014" - why?“Learning Perl”第 6 版中的某些程序。不使用“使用 5.014” - 为什么?
【发布时间】:2012-08-04 02:18:09
【问题描述】:

我正在学习第 6 版 Llama 的 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.

但是,如果我将“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”,所以我很困惑。

谢谢。

【问题讨论】:

标签: perl


【解决方案1】:

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

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

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

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

【讨论】:

  • @Mark - 如果您可能错过了它,为了完全透明,请将回答此问题的用户的姓名与“Learning Perl”封面上的作者列表相匹配: )
  • 这是一个很好的解释。会做。谢谢!
  • 哇,他是这本书的作者之一!直接从骆驼的嘴里说出来。 :)
【解决方案2】:

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

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

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

【讨论】:

  • 嗯,你的意思是这样? #!/usr/bin/perl 使用 5.014;我的总和 = 0;我的 $n = 1;而 ($n
  • @MarcAdler 评论不支持高级格式。无论如何,您不想在多个地方为同一个变量声明“我的”。只需在程序顶部声明my $sum,然后像往常一样使用它。您需要阅读variable scope以了解my的含义。
  • @MarcAdler - cmets 中唯一可以帮助处理代码的格式是用于固定宽度文本的反引号(如 Tim 评论中的 my $sum)。 cmets 支持的 Markdown 子集的完整规则可以在 Meta Stack Overflow 上找到,或者通过单击添加文本框的评论右侧的小“帮助”链接
【解决方案3】:

use &lt;version&gt;; 默认启用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";

【讨论】:

  • 这个答案没有解释发生了什么。你还注释掉了use 5.014;这是造成 OP 混乱的原因。
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多