Perl关联数组和变量赋值

时间:2014-01-20 22:20:18

标签: arrays perl associative-array

我无法理解这是如何工作的。我在while循环之外定义了两个哈希。目标是能够检测shell类型,并将适当的哈希值分配给新的$ shell变量。这是我目前正在尝试的代码..

#!/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);

我尝试了许多不同的事情但没有用,所以我终于在stackoverflow上求助于专业人士以获得一些指导!

非常感谢任何帮助。谢谢。

3 个答案:

答案 0 :(得分:5)

您的my $shellif区块内的词汇。将其移到if之外或在那里不可用。添加一些缩进有助于发现它。

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

之后,您将收到一条警告,指出%shell未定义。这是因为您使用的是$shell{url},但您将$shell定义为哈希引用,因此您需要$shell->{url}中的$$shell{url}print

答案 1 :(得分:3)

两个问题:

  1. 您的my $shell变量的词法作用域为if语句。它在外面不可见。

  2. $shell变量是hashref。因此,您必须使用$shell->{url}访问元素。请注意箭头。

  3. 所以以下内容应该有效:

    my $shell;
    if ($shelltype == 1) { $shell = \%multicity; } else { $shell = \%singlecity; };
    
    print "Shelltype: $shelltype\n";
    print "Should be $shell->{url}\n";
    

答案 2 :(得分:0)

这一行:

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

应该是:

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

原因是你要将对两个哈希值之一的引用分配给$ shell,所以要访问其中的值,你需要取消引用(使用 - &gt;运算符)。

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