Arrays Perl关联数组和变量赋值
我很难理解这是怎么回事。我在while循环之外定义了两个哈希。目标是能够检测shell类型,并将适当的哈希分配给新的$shell变量。这是我目前正在尝试的代码Arrays Perl关联数组和变量赋值,arrays,perl,associative-array,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;
#!/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);
#/usr/bin/perl
严格使用;
使用警告;
使用POSIX;
使用日期时间;
使用术语::ANSIColor qw(:常数);
本地$Term::ANSIColor::AUTORESET=1;
我的$dt=DateTime->now;#将当前日期和时间存储为datetime对象
我的%multicity=(
url=>“example.com”,
ftpuser=>“用户”,
ftppass=>“通过”,
远程目录=>“/httpdocs/”,
dbname=>“数据库”
);
我的%singlecity=(
url=>“example2.com”,
ftpuser=>“用户”,
ftppass=>“通过”,
远程目录=>“/httpdocs/”,
dbname=>“数据库”
);
打开(MYFILE,'sites.txt');
行:while(){
下一行if/^#/;
my($shelltype、$siteurl、$ftpuser、$ftppass、$dbname)=拆分/\ \ \ \/;
#1 | example.com | user | pass | databasename-这应该是一个singlecity shell类型。
如果($shelltype==1){my$shell=\%multicity;}否则{my$shell=\%singlecity;};
打印“Shelltype:$Shelltype\n”;
打印“应为$shell{url}\n”;
}
关闭(MYFILE);
我尝试了很多不同的方法,但都没有效果,所以我最终还是求助于stackoverflow的专业人士来获得一些指导
非常感谢您的帮助。谢谢。您的
我的$shell
是if
块中的词法。如果或那里没有,请将其移到之外。添加一些缩进有助于发现这一点
my $shell;
if ($shelltype == 1) {
$shell = \%multicity;
} else {
$shell = \%singlecity;
};
之后,您将收到一条警告,说明%shell
未定义。这是因为您使用的是$shell{url}
,但您将$shell
定义为散列引用,因此您需要$shell->{url}
或$$shell{url}
在打印中打印这一行:
print "Should be $shell{url}\n";
应该是:
print "Should be $shell->{url}\n";
原因是您将引用分配给$shell的两个哈希之一,因此要访问其中的值,您需要取消引用(使用->运算符)
此外,正如nwellholf所指出的,$shell变量是if语句的本地变量,因此在那里可能会出现编译错误。两个问题:
您的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";
这就成功了。谢谢你@simbabque。这很有道理。其他人的答案基本相同,但看起来是你先回答的。