Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 引用数组的大小已下降到一个元素_Arrays_Perl_Hash_Reference - Fatal编程技术网

Arrays 引用数组的大小已下降到一个元素

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 ); 通过一个由变量和字符串后缀组成的变量,这当然

亲爱的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
);
通过一个由变量和字符串后缀组成的变量,这当然会导致如下错误消息

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'
        ];

你到底想解决什么问题?解释你想要实现什么,而不是如何实现。你想要解决的确切问题是什么?解释你想要实现什么,而不是如何实现。是的,你是对的。我已经弄明白了,但你的反应比我回答我的问题更快。无论如何,谢谢你。是的,你说得对。我已经弄明白了,但你的反应比我回答我的问题更快。无论如何,谢谢你。博罗丁,谢谢你宝贵的回答和非常好的解释。作为初学者,这对我很有帮助。博罗丁,谢谢你宝贵的回答和很好的解释。对我来说