Perl: заменить значение в хэше массива ссылками на масштабирование - PullRequest
0 голосов
/ 25 сентября 2018

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

1 Ответ

0 голосов
/ 25 сентября 2018

Помимо комментариев выше, код труден для чтения и, следовательно, для понимания, и что ваша структура данных не описана точно ...

Вы хотите заменить скалярное значение 'null' значениемв $new, верно?Требуется ли регулярное выражение или его достаточно для замены значения, если оно равно 'null':

if ( grep /null/i, @{$cpudata{$lpar}} ) {

    # why are your storing $lpar in $lop?
    my $lop = $lpar;

    # $new has to use unique variables for specific data #
    $new = qx(ssh -i $key hscroot\@$hmc01 lshwres -r proc -m RSQ- 
    20-p8408-44E-SNCCCCCCC --level lpar --filter \"lpar_names\=$lop\" -F 
    \"curr_procs,curr_max_procs\");

    ## maybe map will do the substitution in case you do not need
    ## a regular expression, just use 
    ##     { ($_ eq "null") ? $new : $_ }
    ## as map instruction
    @{$cpudata{$lop}} = map { s/null/$new/g } @{$cpudata{$lop}};
    }

Редактировать. Правка показала, что вам необходимо заменить "null\n".Поэтому вы можете удалить разрыв строки и, следовательно, использовать s/null\s*/$new/g.Кстати ... Вы ожидаете одну замену, поэтому /g не требуется.

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