0

我进行了几次讨论以找到解决方案,但它们似乎都不适用于我的情况。

我有以下一段代码

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 中的显式包名称

有人可以帮助我吗?我的意图是在我的脚本中添加选项/开关。就像我从案例 stmt 开始的“test.pl -A”、“test.pl -B”。请就此提供意见。

4

2 回答 2

2

你的$DirAand$DirB不是全局的,它们只在if声明它们的语句范围内定义my。通常,来自文档:“Amy将列出的变量声明为本地(词法)封闭块、文件或eval。” 要在后面的任何代码中使用它们,您必须执行以下操作:

my $DirA;
my $DirB;

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

请注意else:如果不是,您也应该做一些事情,$x因为即使 "op1"代码已经运行,您在尝试将未定义的值传递给opendir.

于 2013-04-10T00:12:27.080 回答
2

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

my $DirA;
my $DirB;

if ($x eq "op1") {
    $DirA = "./A";
    $DirB = "./B";
}
于 2013-04-10T00:13:13.283 回答