2014-01-20 4 views
3

이것이 어떻게 작동하는지 이해하는 데 문제가 있습니다. 나는 while 루프 밖에서 두 개의 해시를 정의했다. 그리고 목표는 셸 유형을 감지하고 새 $ 셸 변수에 적절한 해시를 할당하는 것입니다. 여기에 내가 노력 현재 해요 코드 ..Perl 연관 배열 및 변수 할당

#!/usr/bin/perl 
use strict; 
use warnings; 

use POSIX; 
use DateTime; 
use Term::ANSIColor qw(:constants); 

local $Term::ANSIColor::AUTORESET = 1; 
my $dt = DateTime->now; # Stores current date and time as datetime object 

my %multicity = (
     url  => "example.com", 
     ftpuser => "user", 
     ftppass => "pass", 
     remote_dir => "/httpdocs/", 
     dbname  => "database" 
); 

my %singlecity = (
     url  => "example2.com", 
     ftpuser => "user", 
     ftppass => "pass", 
     remote_dir => "/httpdocs/", 
     dbname  => "database" 
); 

open (MYFILE, 'sites.txt'); 

LINE: while (<MYFILE>) { 
    next LINE if /^#/; 
    my ($shelltype, $siteurl, $ftpuser, $ftppass, $dbname) = split /\|/; 

    # 1|example.com|user|pass|databasename - This should be a singlecity shell type. 
    if ($shelltype == 1) { my $shell = \%multicity; } else { my $shell = \%singlecity; }; 

    print "Shelltype: $shelltype\n"; 
    print "Should be $shell{url}\n"; 

} 
close (MYFILE); 

나는 내가 드디어 방향을 얻기 위해 유래 여기 프로에 의존하고있어 아무 소용이와 많은 다른 것들을 시도했습니다입니다!

모든 도움을 주시면 대단히 감사하겠습니다. 고맙습니다.

답변

5

my $shellif 블록의 어휘입니다. if 바깥으로 옮기거나 사용할 수 없습니다. 들여 쓰기를 추가하면이를 알 수 있습니다.

my $shell; 
if ($shelltype == 1) { 
    $shell = \%multicity; 
} else { 
    $shell = \%singlecity; 
}; 

그런 다음 %shell이 정의되지 않았다고 경고합니다. 이는 $shell{url}을 사용하고 있지만 $shell을 해시 참조로 정의했기 때문에 print$shell->{url} 또는 $$shell{url}이 필요합니다.

+0

이 트릭을했다. 고마워요 @ 짐바브웨. 완벽하게 이해합니다. 다른 사람들의 대답은 거의 비슷하지만 처음 대답 한 것처럼 보입니다. – Brandon

0

이 줄 :

print "Should be $shell{url}\n"; 

은 다음과 같아야합니다

print "Should be $shell->{url}\n"; 

이유는 당신이 그렇게 거기에 값을 액세스하려면 $ 쉘로 두 해시 중 하나에 대한 참조를 할당하는 것입니다 -> 연산자를 사용하여 참조 해제해야합니다.

또한 nwellholf가 지적한 것처럼 $ shell 변수는 if 문에서 로컬이므로 컴파일 오류가 발생합니다.

3

두 가지 문제 :

  1. 귀하의 my $shell 변수가 사 전적으로 if 문에 속합니다. 외부에서는 볼 수 없습니다.

  2. $shell 변수는 해시 참조입니다. 따라서 $shell->{url}을 사용하여 요소에 액세스해야합니다. 화살표에 유의하십시오.

그래서 다음과 같은 작업을해야합니다 :

my $shell; 
if ($shelltype == 1) { $shell = \%multicity; } else { $shell = \%singlecity; }; 

print "Shelltype: $shelltype\n"; 
print "Should be $shell->{url}\n";