@ {$ hds {$ cl} {connlist}}做了什么?

时间:2015-01-06 15:18:38

标签: perl

%hds = ();

%hd_var = &hd_var( @{ $hds{$cl}{connlist} }, @{ $hds{$cl}{welllist} } );

我是PERL的新手,我需要破解一些代码才能加快优化速度,所以我想先弄清楚代码在做什么。

这是做什么的:

@{ $hds{$cl}{connlist} } 

hd_var在此语句之前是一个空哈希,那么$hds{$cl}{connlist}做了什么? $cl等于" network",那么$hds{"network"}{connlist}做什么?它没有分配任何东西,所以它是否用空字符串作为其值创建哈希散列?我不确定并希望有专家来帮助我。

3 个答案:

答案 0 :(得分:2)

在此代码中

@{ $hds{$cl}{connlist} }

$hds{$cl}{connlist}应该是一个数组引用,并且它周围的@{ }取消引用数组引用。

这与说:

相同
my $arrayref = $hds{$cl}{connlist};
my @array    = @{$arrayref};
# or
my @array    = @$arrayref;

答案 1 :(得分:0)

谈论'投入深渊'。

请注意,&hd_var是一个函数,与散列%hd_var分开。

该函数的第一个参数是一个数组;第二个也是如此。 @{ … }表示法表示是数组引用。有一个哈希%hds,由$cl索引,然后connlist生成一个数组引用,在cal中取消引用。第二个参数类似,但第二个下标是welllist而不是connlist。很可能在它们之间,它们是需要处理的机器列表。


一些示例代码模仿我对数据结构的看法:

#!/usr/bin/env perl
use strict;
use warnings;

my $cl = "network";

my %hds = ( "network" => { connlist => [ 'mach1', 'mach2', 'oatmeal' ],
                           welllist => [ 'steeple', 'spire', 'windcock' ],
                         }
          );

print "@{$hds{$cl}{connlist}}\n";
print "@{$hds{$cl}{welllist}}\n";

sub hd_var  # Function name same as variable name - not usually a good idea
{
    return grep { !/i/ } @_;
}

my %hd_var = &hd_var( @{ $hds{$cl}{connlist} }, @{ $hds{$cl}{welllist} } );

for my $key (keys %hd_var)
{
    print "$key = $hd_var{$key}\n";
}

示例输出:

mach1 mach2 oatmeal
steeple spire windcock
oatmeal = steeple
mach1 = mach2

请注意,尽管代码中已清空%hd_var,但也可以按照我的代码中的说明创建%hds。必须填充&hd_var哈希,以便代码执行任何有用的操作。

上面的代码很脆弱;它将{{1}}返回的数组转换为散列,但不确保返回的数组中有偶数个元素。使用写入的函数和显示的数据,它可以正常工作,但它很容易破坏。它只是让您了解周围代码中可能发生的事情。

答案 2 :(得分:0)

(这是“Perl”,而非“PERL”)

@{ $hds{$cl}{connlist} }

此代码希望您有一个名为%hds的哈希。此哈希应包含与$cl中当前所有内容匹配的密钥。表达式$hds{$cl}为您提供与哈希中该键相关联的值。

该值应该是一个哈希引用,然后我们在引用的哈希中查找键connlist(这是一个文字值)。我们得到与该键相关联的值,该值应该是一个数组引用,我们可以取消引用它们到达我们需要的数组。

另一种看待它的方法是将其分解为单独的语句。

my $hash_ref = $hds{$cls};
my $arr_ref  = $hash_ref->{connlist};
my @array    = @{ $arr_ref };

您还可以使用Data :: Dumper;

更好地查看此数据结构
use Data::Dumper;

print Dumper \%hdc;

这有帮助吗?