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

Perl @{$hds{$cl}{connlist}做什么?,perl,Perl,我是PERL新手,我需要破解一些代码以加快优化速度,所以我试图首先弄清楚代码在做什么 这是在做什么: %hds = (); %hd_var = &hd_var( @{ $hds{$cl}{connlist} }, @{ $hds{$cl}{welllist} } ); hd_var在此语句之前是一个空哈希,那么$hds{$cl}{connlist}做什么呢$cl等于“network”,那么$hds{“network”}{connlist}做什么呢?它没有分配任何内容,所以它是否创建了

我是PERL新手,我需要破解一些代码以加快优化速度,所以我试图首先弄清楚代码在做什么

这是在做什么:

%hds = ();

%hd_var = &hd_var( @{ $hds{$cl}{connlist} }, @{ $hds{$cl}{welllist} } );
hd_var
在此语句之前是一个空哈希,那么
$hds{$cl}{connlist}
做什么呢
$cl
等于“network”,那么
$hds{“network”}{connlist}
做什么呢?它没有分配任何内容,所以它是否创建了一个散列,并将空字符串作为其值?我不确定,希望能有专家来帮我。

在这段代码中

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

这等于说:

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

谈论“在最深处投入”

请注意,
&hd\u var
是一个函数,与hash
%hd\u var
分开

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


一些模拟我看到的数据结构的示例代码:

my $arrayref = $hds{$cl}{connlist};
my @array    = @{$arrayref};
# or
my @array    = @$arrayref;
样本输出:

#!/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";
}
请注意,尽管代码中的
%hd\u var
是空的,但它也可以像我的代码中所示那样创建。必须填充
%hds
散列,代码才能执行任何有用的操作

上面的代码是脆弱的;它将
&hd_var
返回的数组转换为散列,但不确保返回的数组中有偶数个元素。函数如所写,数据如图所示,工作正常,但很容易中断。它只是让您了解周围代码中可能发生的情况。

(它是“Perl”,而不是“Perl”)

此代码希望您有一个名为
%hds
的散列。此散列应包含一个与当前
$cl
中的任何内容匹配的键。表达式
$hds{$cl}
获取哈希中与该键关联的值

该值应该是散列引用,因为我们随后在引用的散列中查找键
connlist
(这是一个文本值)。我们获得与该键相关联的值,该值应该是一个数组引用,我们可以取消引用该数组以获得所需的数组

另一种看待它的方式是将它分解成这样的单独语句

@{ $hds{$cl}{connlist} }
您还可以通过使用data::Dumper更好地查看此数据结构

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

那有什么帮助吗?

谢谢你迄今为止的帮助。我理解{}解除列表引用的保护,但是$hds{$cl}{connlist}做什么呢?my$listref=$hds{$cl}{connlist};创建对它的引用,但我不理解这部分的作用。hds以前是一个空散列。它被称为自动生存。最好读一读,而不是我提出一个解释。“安迪莱斯特:你会考虑改变你的例子变量的名字吗?”它们是数组(和数组引用),而不是列表(和列表引用)。使用包含“list”的名称可能会鼓励人们(错误地)相信Perl中的数组和列表是一样的。非常感谢您的帮助!“被$cl索引,然后通过connlist生成数组引用”是什么意思。是不是用connlist作为第二个索引创建了第二个散列,其中包含一个空值?如果没有更多的代码,很难判断。我会设法编造一些能胜任这项工作的东西。你需要一个坚实的参考,哈希和数组(列表)的工作知识来理解它。是的,它帮助了很多。但在此语句之前%hds为空。%hds=();。因此,由于代码需要一个匹配$cl的键,但没有找到它,我猜它会在这里动态创建所有这些?是的,它将创建
$hds{$cls}
,其中将包含对新哈希的引用。和
$hds{$cl}{connlist}
,其中将包含对新(因此为空)数组的引用。但这似乎是一种相当令人困惑的方式。@jcmoon:注意,您有
%hd_var=()(这实际上是不必要的,因为您会立即为其指定一个新值);您不会显示如何创建
%hds
,但其中必须已经有数据。
my $hash_ref = $hds{$cls};
my $arr_ref  = $hash_ref->{connlist};
my @array    = @{ $arr_ref };
use Data::Dumper;

print Dumper \%hdc;