Perl Can';在使用严格引用时,不要将字符串用作数组引用

Perl Can';在使用严格引用时,不要将字符串用作数组引用,perl,Perl,尝试转储多维哈希数组的一部分时出错。Perl吐出 在./myscript.pl中使用“strict refs”时,不能将字符串(“somedata”)用作数组引用 我尝试了多种方法来访问我想要查看的阵列的一部分,但总是出现错误。我使用Dumper查看了整个阵列,它看起来很好 #!/usr/bin/perl use strict; use warnings; use Data::Dumper qw(Dumper); use String::Util qw(trim); my %arrHost

尝试转储多维哈希数组的一部分时出错。Perl吐出

在./myscript.pl中使用“strict refs”时,不能将字符串(“somedata”)用作数组引用

我尝试了多种方法来访问我想要查看的阵列的一部分,但总是出现错误。我使用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);

我只想在DEV中打印solaris版本11的服务器。使用哈希似乎是存储数据的最简单方法,但遗憾的是,当试图只打印数据的一部分时,Perl会出错。Dumper工作得很好,但我不想看到所有东西。我哪里出错了???

您有以下问题:

$arrHosts{$strOS}{$strVer}{$strEnv} = $strHostname;
这意味着以下内容包含一个字符串:

$arrHosts{solaris}{10}{DEV}
您将其视为包含对数组的引用。要按OS+ver+env对主机进行分组,请替换

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


@{$arrHosts{solaris}{10}{DEV}}
上进行迭代将是有意义的。

我以前的代码也有一个明显的问题,即如果操作系统、版本和环境的组合是相同的,它会在以前的数据上进行写入。鲁莽的。Push是一个技巧

看起来像是
$arrHosts{solaris}{10}{DEV}
不是一个数组,但您仍然试图以数组的形式访问它,这确实更有意义。现在我知道推的作用了。谢谢你这么说。
$arrHosts{$strOS}{$strVer}{$strEnv} = $strHostname;
push @{ $arrHosts{$strOS}{$strVer}{$strEnv} }, $strHostname;