2013-04-10 6 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) { 
. 
. 
. 
} 

Я получаю эту ошибку: Global символ «$ Дира» требует явного имени пакета в 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 не являются глобальными, они определены только в рамках if заявления, в котором они объявлены с my. В общем случае от 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 "Не удалось открыть каталог DirA!"; Использование неинициализированного значения в строке на строке test_switch.tc 47, <> line 1. Не удалось открыть каталог DirA! на строке test_switch.tc 47, <>. Это строка opendir – Rancho

+0

Не помещайте 'my' внутри' if' и 'else'. Это замаскирует переменные с тем же именем, которые определены вне блока. Чтобы убедиться, что все в порядке, 'print 'DirA = $ DirA и DirB = $ DirB \ n" 'перед' opendir'. – miorel

+0

Спасибо! Это работает :) – Rancho

2

Просто объявите переменные до блок if, и они будут доступны после этого.

my $DirA; 
my $DirB; 

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

Спасибо :) Это сработало! – Rancho