Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl关联数组和变量赋值_Arrays_Perl_Associative Array - Fatal编程技术网

Arrays Perl关联数组和变量赋值

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;

我很难理解这是怎么回事。我在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);
#/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。这很有道理。其他人的答案基本相同,但看起来是你先回答的。