我无法理解这是如何工作的。我在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上求助于专业人士以获得一些指导!
非常感谢任何帮助。谢谢。
答案 0 :(得分:5)
您的my $shell
是if
区块内的词汇。将其移到if
之外或在那里不可用。添加一些缩进有助于发现它。
my $shell;
if ($shelltype == 1) {
$shell = \%multicity;
} else {
$shell = \%singlecity;
};
之后,您将收到一条警告,指出%shell
未定义。这是因为您使用的是$shell{url}
,但您将$shell
定义为哈希引用,因此您需要$shell->{url}
中的$$shell{url}
或print
。
答案 1 :(得分:3)
两个问题:
您的my $shell
变量的词法作用域为if
语句。它在外面不可见。
$shell
变量是hashref。因此,您必须使用$shell->{url}
访问元素。请注意箭头。
所以以下内容应该有效:
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语句的本地变量,因此你会在那里得到一个编译错误。