在使用严格引用时不能将字符串用作 ARRAY 引用
Can't use string as an ARRAY ref while strict refs in use
当我尝试转储多维哈希数组的一部分时出现错误。 Perl 吐出来
在 ./myscript.pl
使用 "strict refs" 时不能使用字符串 ("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);
数据在表格中
machine:OS:OSversion:Environment
例如
bigserver:solaris:11:PROD
smallerserver:solaris:11:DEV
我只想在 DEV 中打印出 solaris 版本 11 的服务器。使用散列似乎是存储数据的最简单方法,但是,唉,Perl 在尝试仅打印出数据的一部分时会失败。 Dumper 效果很好,但我不想看到所有内容。我哪里错了??
您有以下内容:
$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} }
将变得有意义。
我以前的代码也有一个明显的问题,如果 OS、版本和环境的组合相同,它就会覆盖以前的数据。失误。推送是诀窍
当我尝试转储多维哈希数组的一部分时出现错误。 Perl 吐出来
在 ./myscript.pl
使用 "strict refs" 时不能使用字符串 ("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);
数据在表格中 machine:OS:OSversion:Environment
例如
bigserver:solaris:11:PROD
smallerserver:solaris:11:DEV
我只想在 DEV 中打印出 solaris 版本 11 的服务器。使用散列似乎是存储数据的最简单方法,但是,唉,Perl 在尝试仅打印出数据的一部分时会失败。 Dumper 效果很好,但我不想看到所有内容。我哪里错了??
您有以下内容:
$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} }
将变得有意义。
我以前的代码也有一个明显的问题,如果 OS、版本和环境的组合相同,它就会覆盖以前的数据。失误。推送是诀窍