2013-04-10 2 views
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에서 명시 적으로 패키지 이름이 필요합니다 같은. 내 의도는 내 스크립트에 옵션/스위치를 추가하는 것입니다. "test.pl -A", "test.pl -B"처럼 case stmt로 시작했습니다. 이것에 대한 정보를 입력하십시오.

+0

perl 모듈을 사용할 수 있습니까? 그렇다면 [Getopt :: Long] (http://search.cpan.org/~jv/Getopt-Long-2.39/lib/Getopt/Long.pm)을 사용하는 것이 좋습니다. 그것은 당신의 삶을 좀 더 쉽게 만들어 줄 것입니다. – David

답변

2

귀하의 $DirA$DirB는 그들은 그들 만이 my 선언하고있는 if 문의 범위에 정의되어, 글로벌되지 않습니다. 일반적으로 the documentation에서 : "A my은 나열된 변수가 둘러싸는 블록, 파일 또는 eval에 로컬 (어휘)으로 선언합니다." 다음 코드에서 사용하려면 같은 것을해야 할 것이다 :

my $DirA; 
my $DirB; 

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

주를 else : $x하지"op1" 경우 당신은 또한 뭔가를해야 그 코드가 있었다하더라도 약자로 인해 정의되지 않은 값을 opendir으로 전달하려고하면 오류가 발생했을 것입니다.

+0

감사. 이제 추가 후이 오류가 발생합니다 if ($ x eq "op1") { my $ DirA = "./A"; my $ DirB = "./B"; } else { my $ DirA = "./C"; my $ DirB = "./D"; } opendir my ($ dh), "$ DirA"또는 die "Dir DirA를 열 수 없습니다!"; test_switch.tc 줄 47의 문자열에서 초기화되지 않은 값 사용 <> 줄 1 DirA를 열 수 없습니다! test_switch.tc 라인 47, <> 라인. opendir 줄입니다. – Rancho

+0

'my'를'if'와'else' 안에 넣지 마십시오. 이렇게하면 블록 외부에 정의 된 같은 이름의 변수가 마스크됩니다. 문제가 없는지 확인하기 위해'opendir' 전에'print "DirA = $ DirA와 DirB = $ DirB \ n"'. – miorel

+0

감사합니다. 그것은 작동합니다 :) – Rancho

2

앞에if 블록을 선언하면 나중에 액세스 할 수 있습니다.

my $DirA; 
my $DirB; 

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

고마워 :) 그게 효과가! – Rancho