2013-07-03 13 views
5

Próbuję dowiedzieć się, jak mogę używać tych samych zmiennych w moich blokach if/else. Na przykład:Perl zmienna zakres i przy użyciu tych samych zmiennych w bloku if/else

$var1 
$var2 
$var3 

if(condition) { 
... 
} 
else { 
... 
} 

Potrzebuję uzyskać dostęp do $ vars1, 2 i 3 w blokach, ale nie mogę. Myślę, że mam problem z zakresu. Próbowałem je globalnie, ale widzę wiele błędów i program nie działa poprawnie. czego mi brakuje?

Oto mój kod. Moim problemem jest to, że zmienne na dole (@varList, itp.) Są potrzebne dla serwera, ponieważ jest to skrypt na serwerze apache, który również używa CGI. to wypluwa błędy tak:

[error] Global symbol "$questionslist" requires explicit package name at /home/megaoff/www/vi 
ewquestions.dhtml line 46.\nGlobal symbol "$site" requires explicit package name at /home/megaoff/www/viewquestions.dhtm 
l line 46.\nGlobal symbol "$xs" requires explicit package name at /home/megaoff/www/viewquestions.dhtml line 46.\nGlobal 
symbol "$username" requires explicit package name at /home/megaoff/www/viewquestions.dhtml line 46.\n 

#!/usr/bin/perl 

use strict; 
use CGI; 
use BarryP; 

my $pagev = BarryP::makeP("noextracook", 1); 
my $bvga = $pagev->{'vga'}; 
my %vga = %$bvga; 
my $cgi = CGI->new; 
my $usePage = "answerquestions.html"; 
my $anslist = "/home/megaoff/www/limages/anslist.txt"; 
my $unanslist = "/home/megaoff/www/limages/unanslist.txt"; 

my $action = $vga{"action"}; 


if($action eq 'adminmode') { 
    my @a_list = $pagev->listFile($anslist); 
    my %list = map { split(/\t/, $_, 2) } @a_list; 
} 
else { 
    my @u_list = $pagev->listFile($unanslist); 
    chomp @u_list; 
    my %questions = map { $_ => '' } @u_list; 
    my $question = $cgi->param('question'); 
    my $answer = $cgi->param('answer'); 
    chomp($question, $answer); 

    open(my $ANS, '>>', $anslist) or die "Can't open file $anslist: $!"; 
    print $ANS "$question\t$answer\n"; 
    close($ANS) or die "Can't close file $anslist: $!"; 

    delete $questions{$question}; 
    open(my $UNANS, '>', $unanslist) or die "Can't open file $unanslist: $!"; 
    print $UNANS "$_\n" foreach keys %questions; 
    close($UNANS) or die "Can't close file $unanslist: $!"; 

    my $questionslist = join("<br>", @u_list); 
    my $site = $pagev->{'site'}; 
    my $xs = $pagev->{'xs'}; 
    my $username = $pagev->{'username'}; 
} 

my @varList = ('questionslist', $questionslist, 'action', $action, 'site', $site, 'xs', $xs, '$username', $username); 

$pagev->pageHeader($usePage, @varList); 
+3

"Podany przykład kodu" nic nie mówi. Podaj coś bardziej znaczącego, np. Kod, nad którym pracujesz, abyśmy mogli Ci pomóc. –

+0

W pokazanym przykładzie wszystkie trzy zmienne byłyby w zasięgu. –

+0

Zrobię, daj mi kilka sekund. –

Odpowiedz

6

Twój problem jest z scopingu. W linii 46, gdy odwołujesz się do $ questionlist i innych, oni już wypadli poza zasięg, ponieważ zdefiniowałeś je w bloku else.

Ty (uproszczony):

if ($blah) { 
    # do stuff 
} else { 
    # do other stuff 
    my $variable = "something"; 
} 

doSomethingWith($variable); # illegal, $variable is not in scope. 

$variable nie jest zdefiniowana poza blokiem innego, a blok inny nie może nawet być wykonana. Musisz albo umieścić funkcję w bloku else, albo znaleźć sposób na podanie tych wartości domyślnych i zadeklarować je przed instrukcją if.

+0

Potrzebuję, aby były dostępne dla obu, jeśli/else blokuje. Jak to zrobić? EDYCJA: Właściwie, robiłbym my ($ var1, $ var2, $ itp.) Działa? Zadeklarować je jako listę, zanim jeszcze ich użyję? –

+0

Sprawdź moją edycję, aby uzyskać dokładniejsze wyjaśnienie. – OmnipotentEntity

+0

Zrobiłem to: my ($ lista pytań, akcja $, strona $, $ xs, $ nazwa użytkownika); wydaje się działać dobrze teraz! Dzięki za pomoc. –

1

Idealnie zmiennej deklaracje powinny mieć możliwie szczelnego, a jednocześnie jest w zakres kodu zakres które potrzebują dostępu do zmiennych.

my $var1 = 'aBcD'; 
my $var2; 
if ($uc) { 
    $var2 = uc($var1); 
} 
else { 
    $var2 = lc($var1); 
} 

Oczywiście, że można zapisać

my $var1 = 'aBcD'; 
my $var2 = $uc ? uc($var1) : lc($var1); 
Powiązane problemy