【问题标题】:Can't use string as an ARRAY ref while strict refs in use使用严格的引用时不能使用字符串作为数组引用
【发布时间】:2020-02-21 01:38:45
【问题描述】:

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

在 ./myscript.pl 中使用“strict refs”时,不能使用字符串(“somedata”)作为 ARRAY ref

我尝试了多种方法来访问我想查看的部分数组,但总是出错。我用 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);

数据在表格中 机器:操作系统:操作系统版本:环境

例如

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

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

【问题讨论】:

  • 好像$arrHosts{solaris}{10}{DEV} 不是一个数组,你仍然试图将它作为一个数组访问

标签: arrays perl solaris arr data-dumper


【解决方案1】:

我之前的代码也有一个明显的问题,如果操作系统、版本和环境的组合相同,它会覆盖之前的数据。大错特错。推是诀窍

【讨论】:

    【解决方案2】:

    你有以下:

    $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} } 就有意义了。

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 2016-12-11
      • 2018-04-08
      • 2014-07-18
      • 1970-01-01
      • 2023-03-31
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多