使用严格的引用时,不能将字符串用作ARRAY引用

时间:2019-10-24 17:02:11

标签: perl

当我尝试转出多维哈希数组的一部分时遇到错误。 Perl吐出

在./myscript.pl

中使用“严格引用”时,不能将字符串(“ somedata”)用作ARRAY引用

我尝试了多种方法来访问要查看的数组的一部分,但是我总是遇到错误。我已经用Dumper看到了整个数组,看起来还不错。

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper qw(Dumper);
use String::Util qw(trim);

my %arrHosts;

open(my $filehdl, "<textfile.txt") || die "Cannot open or find file textfile.txt: $!\n";

while( my $strInputline = <$filehdl> ) {
  chomp($strInputline);
  my ($strHostname,$strOS,$strVer,$strEnv) = split(/:/, $strInputline);
  $strOS = lc($strOS);
  $strVer = trim($strVer);
  $strEnv = trim($strEnv);
  $strOS = trim($strOS);
  $arrHosts{$strOS}{$strVer}{$strEnv} = $strHostname;
}

# If you want to see the entire database, remove the # in front of Dumper
print Dumper \%arrHosts;

foreach my $machine (@{$arrHosts{solaris}{10}{DEV}}) {
  print "$machine\n";
}

close($filehdl);

数据采用以下形式 机器:OS:操作系统版本:环境

例如

bigserver:solaris:11:PROD
smallerserver:solaris:11:DEV

我只想打印DEV中solaris版本11的服务器。使用散列似乎是存储数据的最简单方法,但可惜的是,当Perl尝试仅打印其中一部分时,它会失败。自卸车效果很好,但我不想看到所有内容。我在哪里出错了?

2 个答案:

答案 0 :(得分:3)

您具有以下条件:

$arrHosts{$strOS}{$strVer}{$strEnv} = $strHostname;

这意味着以下内容包含一个字符串:

$arrHosts{solaris}{10}{DEV}

您正在将其视为包含对数组的引用。要按OS + ver + env对主机进行分组,请替换

$arrHosts{$strOS}{$strVer}{$strEnv} = $strHostname;

使用

push @{ $arrHosts{$strOS}{$strVer}{$strEnv} }, $strHostname;

然后在@{ $arrHosts{solaris}{10}{DEV} }上进行迭代就可以了。

答案 1 :(得分:0)

我以前的代码也存在一个明显的问题,即如果OS,Version和Environment的组合相同,则它将覆盖先前的数据。太过分了推就是诀窍