Попытка заменить нулевое значение известным доверенным значением в этом хеше.Я делаю это, но b / c моего оператора s /.../.../ g for (@ ...) печатает значения dup, так что, возможно, я все делаю неправильно, так как я искал и искал.Вот мой код, пожалуйста, предложите вашу помощь.Спасибо!
use strict;
use warnings;
my $hmc01 = qq(rsqxxxx.xxxx.com);
my $key = qq(/home/root/.ssh/id_rsa_hmcscan);
# get frame names
push my @frames, qx(ssh -i $key hscroot\@$hmc01 lssyscfg -r sys -F
name|sort);
chomp @frames;
my (%cpudata,$h,$cpus,$max);
my $cspu = q|configurable_sys_proc_units|;
my $caspu = q|curr_avail_sys_proc_units|;
# get cpu attributes for each lpar on each frame
foreach my $f (@frames) {
open ( my $FD, "-|", "ssh -i $key hscroot\@$hmc01 lshwres -r proc -m
$f --level sys -F $cspu,$caspu" ) or warn $!;
print "\nFrame $f has,$cspu,$caspu,";
for my $fdln (<$FD>) {
my $cspu2 = +(split /\,/, $fdln)[0];
my $caspu2 = +(split /\,/, $fdln)[1];
}
open ( my $FDD, "-|", "ssh -i $key hscroot\@$hmc01 lshwres -r proc -m
$f --level lpar -F
\"lpar_name\\;curr_proc_units\\;curr_max_proc_units\" ") or warn $!;
# POPULATE in format name,cpu,maxcpu
my ($h,$ccpu,$mcpu);
while (( my $fddln = <$FDD> )) {
$h = +(split(";", $fddln, 0))[0];
$ccpu = +(split(";", $fddln, 0))[1];
$mcpu = +(split(";", $fddln, 0))[2];
push @{$cpudata{$h}}, ($ccpu,$mcpu);
}
}
# REPLACE
foreach my $lpar (sort keys %cpudata) {
if ( grep /null/i, @{$cpudata{$lpar}} ) {
#my $lop = $lpar;
($new) = qx(ssh -i $key hscroot\@$hmc01 lshwres -r proc -m RSQ-20-p8408-44E-SN783739X --level lpar --filter \"lpar_names\=$lpar\" -F \"curr_procs,curr_max_procs\");
#s/null/$new/g for @{$cpudata{$lop}};
@{$cpudata{$lpar}} = map { s/null/$new/r } @{$cpudata{$lpar}};
}
print "$lpar,", join(",",@{$cpudata{$lpar}}),"\n";
}
use Data::Dumper; print Dumper \%cpudata;
## INCORRECT b/c of DUPED output
'wassapxxxx' => [
'6,8
',
'6,8
'
],
## CORRECT OUTPUT
'twccntxxxxx' => [
'0.2',
'2.0
'
],
# %cpudata, raw
# 'wassapxxxxx' => [
# '2.5',
# '4.0
#'
#],
# wassapxxxx' => [
# null',
# 'null
#'
# ],
# 'rsqgangliaxxx' => [
# '0.5',
# '2.0
#'
# output of system call top-to-bottom
# lssyscfg -r sys -F name|sort
# IDI-8202-E4B-SN10AAF0B
# RSQ-17-p8286-41A-SNxxxxx
# RSQ-18-p8286-41A-SNxxxxx
# RSQ-19-p8408-44E-SNxxxxx
# RSQ-20-p8408-44E-SNxxxxx
# RSQ-21-p9009-41A-SNxxxxx
# RSQ-22-p9009-41A-SNxxxxx
# RSQ-DR01-8202-E4C-SNxxxx
# WilData-8202-E4C-SNxxxxx
# lshwres -r proc -m RSQ-22-p9009-41A-SNxxxxx --level lpar -F
# "lpar_name;curr_proc_units;curr_max_proc_units"
# DTMiSeriesTxx;0.1;1.0
# NWSPRDxx;0.1;1.0
# MXDPRDxx;0.2;2.0
# TWCICOPE3xxx;0.1;1.0
# vios2xx;1.0;2.0
# R2iSeriesRsxxxx;0.1;1.0
# vios2xxx;1.0;2.0
# wassapdxxx;null;null
# wassapxxxx;null;null
для определенных узлов, я должен использовать переменную curr_procs, curr_max_procs, а не curr_proc_units; curr_max_proc_units, следовательно, переменную $ new.Я не уверен, что еще добавить, я думаю, что код довольно ясно.Пожалуйста, будьте конкретны, чтобы я тоже мог!Thx !!