定义全局符号(错误)

时间:2013-04-10 00:06:53

标签: perl package global explicit

我经历了几次讨论以找到解决方案,但似乎没有一个在我的案例中工作。

我有以下代码

print ("Choose from the following\n");
print ("op1 op2\n");

my $x = <>;  
chomp($x);     
print ("x is $x");

if ($x eq "op1")
{
my $DirA = "./A";
my $DirB = "./B"; # **I want to use this dirA and dir B below (Tried switch stmts but I 
#**get the same error)**
}

opendir my($dh), "$DirA" or die "Couldn't open dir DirA!";
my @files = readdir $dh;
closedir $dh;
system("rm -rf diffs");
system ("mkdir diffs\n");
foreach my $input (@list) {
.
.
.
}

我收到此错误:全局符号“$ DirA”需要test_switch.tc上的显式包名称

有人可以帮我一样。我的意图是为我的脚本添加选项/开关..就像“test.pl -A”,“test.pl -B”,我开始使用case stmt。请提供相关信息。

2 个答案:

答案 0 :(得分:2)

您的$DirA$DirB不是全局的,它们仅在if声明的范围内定义,声明中my声明了my。通常,从the documentation:&#34; A eval声明列出的变量是封闭的块,文件或my $DirA; my $DirB; if ($x eq "op1") { $DirA = "./A"; $DirB = "./B"; } else { $DirA = ... $DirB = ... } 的本地(词汇)。&#34;要在随后的任何代码中使用它们,您必须执行以下操作:

else

请注意$x:如果"op1" opendir,您也应该做一些事情,因为即使代码已经运行,您也应该这样做。 d尝试将未定义的值传递给{{1}}时出错。

答案 1 :(得分:2)

只需在 if块之前声明变量,然后就可以访问它们了。

my $DirA;
my $DirB;

if ($x eq "op1") {
    $DirA = "./A";
    $DirB = "./B";
}