2013-12-13 51 views
1

我是Perl新手,我一直在关注一本书。一切都很好,除了每当我尝试初始化本书所示的变量时,我都会收到如下所示的错误。请告诉我,为了避免这个错误,我该怎么做?Perl - 全局变量需要显式包

代码:

#!/usr/bin/perl -w 
use 5.014; 
use strict; 
use utf8; 

$radius = <STDIN>; 
$circum; 
if ($radius<0){ 
$circum = 0 
} else{ 
    $circum = 2*3.141*$radius; 
} 

print $circum."\n"; 

错误: 全局符号 “$半径” 需要明确包名在./example1线6 全局符号 “$ circum” 需要在./example1 7行明确包名 全局符号“$ radius”需要在./example1第8行显式包名称。 全局符号“$ circum”需要在./example1第9行显式包名。 全局符号“$ circum”需要显式包名。/example1第11行。 全局符号“$ radius”需要显式包名称./exampl e1第11行。 全局符号“$ circum”需要在./example1第14行显式包名称。 执行./example1由于编译错误而中止。

另外,我已经在论坛上的某个地方读过关于'我们'和'我'的关键词。使用这些似乎工作。但是,是否必须使用这些关键字。如果是这样,我认为这本书不包括它们是很奇怪的。

+1

取出'严格使用',它不会是强制性的。 –

+0

如果你使用严格,那么'我'或'我们'是强制性的 – abasterfield

+0

然而'使用strict;'和'使用警告;'应该启动每个Perl脚本,所以真的很奇怪你的书没有告诉你这个东西。 – DeVadder

回答

2

问题是'严格使用'(这实际上是一件非常好的事情)。

的结果是,你的变量需要声明如下:

my $radius = <STDIN>; 

的“我”的关键字,在那里,使局部变量的当前作用域。而'严格使用'说你必须声明所有变量并指定它们的范围。你会想声明变量两种典型的方式是:

my $localOnly; 
our $shareableVariable; 

基本上是:使用“我的”,当你不希望其他人访问变量,并使用“我们”,当你想允许外部访问或设置变量的代码。

1

你已经得到(并接受)了这个问题的答案。但可能值得再提几点。首先,如果您不明白Perl错误消息,那么通常值得在您的代码中添加use diagnostics。这会给你一个更详细的错误解释。在这种情况下,它会说:

(F)你说:“使用严格”或“使用严格瓦尔”, 所有的变量必须被词法范围(使用“我”或 指示“状态”),事先使用“我们的”声明,或明确限定为全局变量所在的包(使用“::”)。

(顺便说一下,显示以前的答案小遗漏。)

其次,你说你的书建议use strict但没有提到my?这听起来很奇怪。在任何情况下,一本没有提及my的Perl书都不是一本很好的Perl书。请告诉我们标题,以便我们可以避免它。

+0

很多“经典”和仍然流行的Perl书籍可追溯到“严格”之前,这是语言的一部分,或者至少在它被广泛采用之前。 – mob

+0

请给我一个例子。 1994年在Perl 5.000中增加了“严格”​​,几乎立即受到鼓励。我不知道从那以后发布的一本“经典”Perl书籍,它没有使用它。 –