Perl @{$hds{$cl}{connlist}做什么?
我是PERL新手,我需要破解一些代码以加快优化速度,所以我试图首先弄清楚代码在做什么 这是在做什么: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}做什么呢?它没有分配任何内容,所以它是否创建了
%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=()问题中的code>(这实际上是不必要的,因为您会立即为其指定一个新值);您不会显示如何创建%hds
,但其中必须已经有数据。
my $hash_ref = $hds{$cls};
my $arr_ref = $hash_ref->{connlist};
my @array = @{ $arr_ref };
use Data::Dumper;
print Dumper \%hdc;