Невозможно использовать строку в качестве ссылки ARRAY, когда используются строгие ссылки - PullRequest
2 голосов
/ 24 октября 2019

Получение ошибки при попытке выгрузить часть многомерного хеш-массива. Perl выплевывает

Невозможно использовать строку ("somedata") в качестве ссылки ARRAY, в то время как используются "строгие ссылки" на ./myscript.pl

Я пробовал несколько способов доступа к частимассива, который я хочу видеть, но я всегда получаю ошибку. Я использовал 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

Я хочу распечатать только серверы Solaris версии 11 в DEV. Использование хешей кажется самым простым способом хранения данных, но, увы, Perl преграждает попытки распечатать только их часть. Самосвал работает отлично, но я не хочу видеть все. Где я ошибся ??

Ответы [ 2 ]

3 голосов
/ 24 октября 2019

У вас есть следующее:

$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} } будет иметь смысл.

0 голосов
/ 24 октября 2019

Мой предыдущий код также имел очевидную проблему, заключающуюся в том, что если бы комбинация ОС, Версии и Среды была такой же, как и предыдущие данные. Blunderful. Трюк это трюк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...