Perl 定义变量作用域时发生编译错误

Perl 定义变量作用域时发生编译错误,perl,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 sym

有人能告诉我为什么没有编译这个片段吗

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”的不同变体,但范围的定义仍然不正确。谢谢

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

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

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

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

您可以说生成更详细的警告/错误