2014-01-20 222 views
3

我无法理解这应该如何工作。我在while循环之外定义了两个哈希。目标是能够检测shell类型,并将适当的散列值分配给新的$ shell变量。这是我目前的尝试代码..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定义为散列参考,因此您需要$shell->{url}$$shell{url}在您的print中。

+0

这并获得成功。谢谢@simbabque。非常有意义。其他人的答案几乎相同,但看起来像你先回答。 – Brandon

0

这条线:

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

应该是:

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

的原因是,您要指派给你的两个散列至$外壳的一个参考,所以在访问它的值你需要去引用(使用 - >运算符)。

另外,正如nwellholf所指出的那样,$ shell变量对于if语句是本地的,所以你会在那里得到一个编译错误。

3

两个问题:

  1. my $shell变量词法范围的if声明。它不会在外面看到。

  2. $shell变量是一个hashref。所以你必须使用$shell->{url}访问元素。注意箭头。

所以下面应该工作:

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

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