%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}
做什么?它没有分配任何东西,所以它是否用空字符串作为其值创建哈希散列?我不确定并希望有专家来帮助我。
答案 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;
这有帮助吗?