К вашему первоначальному вопросу о том, как сохранить данные в массиве ...
Сначала инициализируйте пустой массив вне цикла чтения файла:
my @servers = ();
Затем, внутриПосле того, как вы проанализировали части данных, вы можете сохранить их в своем массиве как подмассивы (результирующая структура данных - двумерный массив):
$servers[$count] = [ $name, $cpuUtil, $avgMemUsage, $diskFree ];
Обратите внимание, квадратные скобки наПраво создать вложенный массив для частей данных сервера и вернуть ссылку на этот новый массив.Кроме того, в левой части мы просто используем текущее значение $ count в качестве индекса в массиве @ servers и по мере увеличения значения размер серверов @ массив будет расти автоматически (это называется автовивификацией новых элементов).В качестве альтернативы, вы можете вставить новые элементы в массив @ servers внутри цикла, например:
push @servers, [ $name, $cpuUtil, $avgMemUsage, $diskFree ];
Таким образом, вы явно запросите новый элементдобавляемый в массив и квадратные скобки по-прежнему делают то же самое создание подмассива.
В любом случае конечный результат состоит в том, что после того, как вы закончили с циклом чтения файла, у вас теперь есть2D-массив, в котором вы можете получить доступ к первому серверу и его свободному полю диска (4-е поле в индексе 3) следующим образом:
my $df = $servers[0][3];
Или проверить все серверы в цикле, чтобы найти минимальное свободное место на диске.:
my $min_s = 0;
for ( my $s = 0; $s < @servers; $s++ ) {
$min_s = $s if ( $servers[$s][3] < $servers[$min_s][3] );
}
print "Server $min_s has least disk free: $servers[$min_s][3]\n";
Как и предполагал @choroba, вы можете хранить части / поля данных сервера в хешах, чтобы ваш код был более читабельным.Вы по-прежнему можете хранить свой список серверов в массиве, но второе измерение может быть хешем:
$servers[$count] = {
name => $name,
cpu_util => $cpuUtil,
avg_mem_usage => $avgMemUsage,
disk_free => $diskFree
};
Таким образом, полученная в результате структура будет представлять собой массив хешей.Здесь фигурные скобки справа создают новый хеш и возвращают ссылку на него.Итак, позже вы можете обратиться к:
my $df = $servers[0]{disk_free};