Perl关联数组和变量赋值

3

我难以理解这个代码应该如何工作。我已经在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个回答

5

你的my $shellif块内部是词法作用域的。将它移到外面,否则它在那里不可用。添加一些缩进可以更好地发现。

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

之后,你会收到一个警告,说%shell没有定义。这是因为你在使用$shell{url},但是你将$shell定义为了一个哈希引用,因此你需要在print中使用$shell->{url}或者$$shell{url}


这个方法很管用。谢谢@simbabque。非常清晰易懂。其他人的答案基本上都是等价的,但看起来你回答得最早。 - Brandon

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";

0

这一行:

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

应该是:

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

原因是您将两个哈希表中的一个引用分配给了 $shell,因此要访问其中的值,您需要解除引用(使用 -> 运算符)。

此外,正如 nwellholf 指出的那样,$shell 变量仅在 if 语句中为局部变量,因此您会在那里得到编译错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接