Arrays 引用数组的大小已下降到一个元素
亲爱的perl程序员同事: 我想访问此阵列Arrays 引用数组的大小已下降到一个元素,arrays,perl,hash,reference,Arrays,Perl,Hash,Reference,亲爱的perl程序员同事: 我想访问此阵列 my @vsrvAttribs = qw( Code Description vsrv_id vsrv_name vsrv_vcpu_no vsrv_vmem_size vsrv_vdspace_alloc vsrv_mgmt_ip vsrv_os vsrv_virt_platf vsrv_owner vsrv_contact vsrv_state ); 通过一个由变量和字符串后缀组成的变量,这当然
my @vsrvAttribs = qw(
Code
Description
vsrv_id
vsrv_name
vsrv_vcpu_no
vsrv_vmem_size
vsrv_vdspace_alloc
vsrv_mgmt_ip
vsrv_os
vsrv_virt_platf
vsrv_owner
vsrv_contact
vsrv_state
);
通过一个由变量和字符串后缀组成的变量,这当然会导致如下错误消息
Can't use string ("@vsrvAttribs") as an ARRAY ref while "strict refs" in use at cmdbuild.pl line 262.`
因此,我决定通过散列获取对数组的引用
my %attribs = ( vsrv => @vsrvAttribs );
这是我需要获取上述数组内容的代码
foreach my $classTypeKey (keys %classTypes) {
my @attribs = $attribs{$classTypeKey};
print Dumper(\@attribs);
}
看起来我可以得到对数组@vsrvAttribs的引用,但是当我用Dumper检查数组的内容时,数组只有一个元素
$VAR1 = [
'Code'
];
您知道问题出在哪里吗?如何将数组存储在散列中并在以后访问它?
您需要通过引用存储数组,如下所示:
my %attribs = ( vsrv => \@vsrvAttribs );
foreach my $classTypeKey (keys %classTypes) {
# make a copy of the array by dereferencing
my @attribs = @{ $attribs{$classTypeKey} };
# OR just use the array reference if profiling shows performance issues:
my $attribs = $attribs{$classTypeKey}
# these will show the same thing if you haven't done anything to @attribs
# in the interim
print Dumper(\@attribs);
print Dumper($attribs);
}
$VAR1 = {
'vsrv_contact' => 'vsrv_state',
'vsrv_virt_platf' => 'vsrv_owner',
'vsrv' => 'Code',
'vsrv_name' => 'vsrv_vcpu_no',
'vsrv_mgmt_ip' => 'vsrv_os',
'Description' => 'vsrv_id',
'vsrv_vmem_size' => 'vsrv_vdspace_alloc'
};
注意@
符号前的反斜杠。这告诉perl您需要对数组的引用
然后,当访问存储在$attribs{vsrv}
中的数组时,需要将其视为引用,而不是数组。您将执行以下操作:
my %attribs = ( vsrv => \@vsrvAttribs );
foreach my $classTypeKey (keys %classTypes) {
# make a copy of the array by dereferencing
my @attribs = @{ $attribs{$classTypeKey} };
# OR just use the array reference if profiling shows performance issues:
my $attribs = $attribs{$classTypeKey}
# these will show the same thing if you haven't done anything to @attribs
# in the interim
print Dumper(\@attribs);
print Dumper($attribs);
}
$VAR1 = {
'vsrv_contact' => 'vsrv_state',
'vsrv_virt_platf' => 'vsrv_owner',
'vsrv' => 'Code',
'vsrv_name' => 'vsrv_vcpu_no',
'vsrv_mgmt_ip' => 'vsrv_os',
'Description' => 'vsrv_id',
'vsrv_vmem_size' => 'vsrv_vdspace_alloc'
};
为什么只得到一个值,而数组的其余部分又到哪里去了?
@vsrvAttribs
中缺少的值并没有丢失,而是作为键和值分配给了%attribs
本身。在完成作业后,尝试添加以下内容,您将亲自看到:
my %attribs = ( vsrv => @vsrvAttribs );
print Dumper(\%attribs);
您将看到如下输出:
my %attribs = ( vsrv => \@vsrvAttribs );
foreach my $classTypeKey (keys %classTypes) {
# make a copy of the array by dereferencing
my @attribs = @{ $attribs{$classTypeKey} };
# OR just use the array reference if profiling shows performance issues:
my $attribs = $attribs{$classTypeKey}
# these will show the same thing if you haven't done anything to @attribs
# in the interim
print Dumper(\@attribs);
print Dumper($attribs);
}
$VAR1 = {
'vsrv_contact' => 'vsrv_state',
'vsrv_virt_platf' => 'vsrv_owner',
'vsrv' => 'Code',
'vsrv_name' => 'vsrv_vcpu_no',
'vsrv_mgmt_ip' => 'vsrv_os',
'Description' => 'vsrv_id',
'vsrv_vmem_size' => 'vsrv_vdspace_alloc'
};
这是因为perl通过将内容@vsrvAttribs
扩展为列表文本()
的多个参数来解释赋值:
这在perl中是合法的,您可能有理由这样做,但在您的情况下,这并不是您想要的
顺便说一句,如果数组中有偶数个元素,您可能会被警告perl正在做一些您可能不想做的事情。你的13个元素使散列键“vsrv”变为14,这是偶数。Perl将获取任何元素数为偶数的列表,并愉快地将其转换为散列。如果您的数组中有另一个包含15个元素和哈希键的元素,您将得到一个警告:foo.pl第28行哈希赋值中的奇数元素。
有关详细信息,请参阅中的“生成引用”和“使用引用”。如何将数组存储在哈希中,并在以后访问它?
您需要通过引用存储数组,如下所示:
my %attribs = ( vsrv => \@vsrvAttribs );
foreach my $classTypeKey (keys %classTypes) {
# make a copy of the array by dereferencing
my @attribs = @{ $attribs{$classTypeKey} };
# OR just use the array reference if profiling shows performance issues:
my $attribs = $attribs{$classTypeKey}
# these will show the same thing if you haven't done anything to @attribs
# in the interim
print Dumper(\@attribs);
print Dumper($attribs);
}
$VAR1 = {
'vsrv_contact' => 'vsrv_state',
'vsrv_virt_platf' => 'vsrv_owner',
'vsrv' => 'Code',
'vsrv_name' => 'vsrv_vcpu_no',
'vsrv_mgmt_ip' => 'vsrv_os',
'Description' => 'vsrv_id',
'vsrv_vmem_size' => 'vsrv_vdspace_alloc'
};
注意@
符号前的反斜杠。这告诉perl您需要对数组的引用
然后,当访问存储在$attribs{vsrv}
中的数组时,需要将其视为引用,而不是数组。您将执行以下操作:
my %attribs = ( vsrv => \@vsrvAttribs );
foreach my $classTypeKey (keys %classTypes) {
# make a copy of the array by dereferencing
my @attribs = @{ $attribs{$classTypeKey} };
# OR just use the array reference if profiling shows performance issues:
my $attribs = $attribs{$classTypeKey}
# these will show the same thing if you haven't done anything to @attribs
# in the interim
print Dumper(\@attribs);
print Dumper($attribs);
}
$VAR1 = {
'vsrv_contact' => 'vsrv_state',
'vsrv_virt_platf' => 'vsrv_owner',
'vsrv' => 'Code',
'vsrv_name' => 'vsrv_vcpu_no',
'vsrv_mgmt_ip' => 'vsrv_os',
'Description' => 'vsrv_id',
'vsrv_vmem_size' => 'vsrv_vdspace_alloc'
};
为什么只得到一个值,而数组的其余部分又到哪里去了?
@vsrvAttribs
中缺少的值并没有丢失,而是作为键和值分配给了%attribs
本身。在完成作业后,尝试添加以下内容,您将亲自看到:
my %attribs = ( vsrv => @vsrvAttribs );
print Dumper(\%attribs);
您将看到如下输出:
my %attribs = ( vsrv => \@vsrvAttribs );
foreach my $classTypeKey (keys %classTypes) {
# make a copy of the array by dereferencing
my @attribs = @{ $attribs{$classTypeKey} };
# OR just use the array reference if profiling shows performance issues:
my $attribs = $attribs{$classTypeKey}
# these will show the same thing if you haven't done anything to @attribs
# in the interim
print Dumper(\@attribs);
print Dumper($attribs);
}
$VAR1 = {
'vsrv_contact' => 'vsrv_state',
'vsrv_virt_platf' => 'vsrv_owner',
'vsrv' => 'Code',
'vsrv_name' => 'vsrv_vcpu_no',
'vsrv_mgmt_ip' => 'vsrv_os',
'Description' => 'vsrv_id',
'vsrv_vmem_size' => 'vsrv_vdspace_alloc'
};
这是因为perl通过将内容@vsrvAttribs
扩展为列表文本()
的多个参数来解释赋值:
这在perl中是合法的,您可能有理由这样做,但在您的情况下,这并不是您想要的
顺便说一句,如果数组中有偶数个元素,您可能会被警告perl正在做一些您可能不想做的事情。你的13个元素使散列键“vsrv”变为14,这是偶数。Perl将获取任何元素数为偶数的列表,并愉快地将其转换为散列。如果您的数组中有另一个包含15个元素和哈希键的元素,您将得到一个警告:foo.pl第28行哈希赋值中的奇数元素。
有关详细信息,请参阅中的“生成引用”和“使用引用”。如果在哈希定义中使用空数组,如
my %attribs = ( vsrv => @vsrv_attribs )
数组被扩展并用作键/值对,因此
我的%attribs=(
vsrv=>“代码”,
Description=>'vsrv_id',
vsrv_名称=>“vsrv_vcpu_编号”,
vsrv_vmem_size=>“vsrv_VDU空间_alloc”,
...
)
Perl散列元素的值只能是标量值,因此,如果需要一个值数组,则必须获取一个引用,如下所示
在Perl标识符中使用大写字母表示除全局字符以外的任何内容(如包名)也是一个坏主意。本地名称是传统的小写字母数字加下划线,因此是$class\u type\u key
而不是$classTypeKey
use strict;
use warnings;
use Data::Dumper;
my @vsrv_attribs = qw(
Code
Description
vsrv_id
vsrv_name
vsrv_vcpu_no
vsrv_vmem_size
vsrv_vdspace_alloc
vsrv_mgmt_ip
vsrv_os
vsrv_virt_platf
vsrv_owner
vsrv_contact
vsrv_state
);
my %attribs = (
vsrc => \@vsrv_attribs,
);
for my $class_type_key (keys %attribs) {
my $attribs = $attribs{$class_type_key};
print Dumper $attribs;
}
输出
$VAR1 = [
'Code',
'Description',
'vsrv_id',
'vsrv_name',
'vsrv_vcpu_no',
'vsrv_vmem_size',
'vsrv_vdspace_alloc',
'vsrv_mgmt_ip',
'vsrv_os',
'vsrv_virt_platf',
'vsrv_owner',
'vsrv_contact',
'vsrv_state'
];
如果在散列定义中使用裸数组,如
my %attribs = ( vsrv => @vsrv_attribs )
数组被扩展并用作键/值对,因此
我的%attribs=(
vsrv=>“代码”,
Description=>'vsrv_id',
vsrv_名称=>“vsrv_vcpu_编号”,
vsrv_vmem_size=>“vsrv_VDU空间_alloc”,
...
)
Perl散列元素的值只能是标量值,因此,如果需要一个值数组,则必须获取一个引用,如下所示
在Perl标识符中使用大写字母表示除全局字符以外的任何内容(如包名)也是一个坏主意。本地名称是传统的小写字母数字加下划线,因此是$class\u type\u key
而不是$classTypeKey
use strict;
use warnings;
use Data::Dumper;
my @vsrv_attribs = qw(
Code
Description
vsrv_id
vsrv_name
vsrv_vcpu_no
vsrv_vmem_size
vsrv_vdspace_alloc
vsrv_mgmt_ip
vsrv_os
vsrv_virt_platf
vsrv_owner
vsrv_contact
vsrv_state
);
my %attribs = (
vsrc => \@vsrv_attribs,
);
for my $class_type_key (keys %attribs) {
my $attribs = $attribs{$class_type_key};
print Dumper $attribs;
}
输出
$VAR1 = [
'Code',
'Description',
'vsrv_id',
'vsrv_name',
'vsrv_vcpu_no',
'vsrv_vmem_size',
'vsrv_vdspace_alloc',
'vsrv_mgmt_ip',
'vsrv_os',
'vsrv_virt_platf',
'vsrv_owner',
'vsrv_contact',
'vsrv_state'
];
你到底想解决什么问题?解释你想要实现什么,而不是如何实现。你想要解决的确切问题是什么?解释你想要实现什么,而不是如何实现。是的,你是对的。我已经弄明白了,但你的反应比我回答我的问题更快。无论如何,谢谢你。是的,你说得对。我已经弄明白了,但你的反应比我回答我的问题更快。无论如何,谢谢你。博罗丁,谢谢你宝贵的回答和非常好的解释。作为初学者,这对我很有帮助。博罗丁,谢谢你宝贵的回答和很好的解释。对我来说