多维数组:参数在数组元素中不是数字

时间:2014-07-18 13:54:32

标签: perl multidimensional-array

操作系统:AIX

Shell:KSH

根据this question上接受的答案,我创建了一个多层数组。只是,我在尝试打印数组内容时遇到错误。

错误:

Argument "content of $pvid" isn't numeric in array element at...

脚本:

#!/usr/bin/perl
use warnings;
use strict;
use Term::ANSIColor;
my @arrpvid = ();

print colored( sprintf("%-10s %9s %8s %8s %8s", 'PVID', 'AIX', 'VIO', 'VTD', 'VHOST'), 'green' ), "\n";
foreach my $pvid (`lspv | awk '{print \$2'}`) {
        foreach my $hdaix (`lspv | awk '{print \$1'}`) {
                chomp $pvid;
                chomp $hdaix;
                push @{ $arrpvid[$pvid] }, $hdaix;
        }
}

print $arrpvid[0][0];

一些解释

基本上我想打印5个不同阵列的5个变量。代码仅针对2个数组编写。

$ pvid的内容:

00088da343b00d9b
00088da38100f93c

$ hdaix的内容:

hdisk0
hdisk1

2 个答案:

答案 0 :(得分:2)

快速修复

看起来你想要使用哈希而不是数组,使你的内部push

push @{ $arrpvid{$pvid} }, $hdaix;

注意$pvid周围的方括号到花括号的变化。这告诉编译器你想要%arrpvid而不是@arrpvid,所以一定要调整你的my声明。

最后要打印%arrpvid的内容,请使用

foreach my $pvid (sort { hex $a <=> hex $b } keys %arrpvid) {
  local $" = "][";  # handy trick due to mjd
  print "$pvid: [@{$arrpvid{$pvid}}]\n";
}

Data::Dumper模块是快速简便的输出工具。

use Data::Dumper;

$Data::Dumper::Indent = $Data::Dumper::Terse = 1;
print Dumper \%arrpvid;

更多详情

您可能想要在$pvid中使用hex获取与每个十六进制字符串对应的数值,如

push @{ $arrpvid[hex $pvid] }, ...

但考虑到问题中的大量示例值,@arrpvid会变得非常庞大。请使用哈希来创建sparse array

确保$pvid的所有值都具有相同的填充。否则,类似值可能不会适当地散列在一起。如果需要规范化,请使用

行中的代码
$pvid = sprintf "%016x", hex $pvid;

答案 1 :(得分:1)

问题在于:

push @{ $arrpvid[$pvid] }, $hdaix;

$pvid应为0或5之类的数值,而不是00088da343b00d9b