我经历了几次讨论以找到解决方案,但似乎没有一个在我的案例中工作。
我有以下代码
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。请提供相关信息。
答案 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";
}