定义变量范围时的编译错误

时间:2011-11-01 09:25:55

标签: perl

有人可以指出我为什么不编译这个片段:

my $crond = "/etc/init.d/crond";
if( -e $crond ) {
    my $d = "d";
}
my $crond = "/etc/init.d/cron$d";

错误:

"my" variable $crond masks earlier declaration in same scope at /home/andrew/sandbox/processes2cron.pl line 27.
Global symbol "$d" requires explicit package name at /home/andrew/sandbox/processes2cron.pl line 27.

我尝试使用'my'进行不同的变化,但仍然没有正确定义范围。感谢。

2 个答案:

答案 0 :(得分:5)

您已在代码的第一行声明变量$crond。通过在第5行重新声明它,您将失去先前的值。在这种情况下,删除第5行的my将停止警告。

变量$d在if块的范围内声明。这意味着它只能在if块结束之前访问。然后尝试在if块之外引用它,这会导致错误。要解决此问题,请在外部作用域中的if语句之前声明$d

答案 1 :(得分:4)

my $crond = "/etc/init.d/crond";
my $d;
if( -e $crond ) {
    $d = "d";
}
$crond = "/etc/init.d/cron$d";

正如错误消息所说的那样。您在同一范围内重新声明$cron,并且$d仅在if块中定义,因此编译器在您使用它时期望$d成为全局变量在最后一行,当它找不到时抱怨。