我想知道是否有一種簡單的方法可以將完整的資料結構(HoH/陣列的混合)轉換為大寫?
例如,我有一個包含許多這樣的條目的結構:
'oracle' => {
'sit' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'ora:oraclepatching'
]
},
'prd' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'odg:oraclepatching',
'ora:oraclepatching'
]
},
'uat' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'odg:oraclepatching',
'ora:oraclepatching'
]
},
'PRD' => {
'ZQ01-42P-UXGROUP' => [
'socdbaud',
'oramgrp',
'wmioca',
'oramigration',
'tac'
]
我想要uc()中的所有東西(鍵和值)有沒有一種巧妙的方法?
我試過這個但它失敗了(后來我得到:'ORACLE' =>'HASH(0X2941738)')
%ds = map uc, %ds;
感謝您的任何提示!
uj5u.com熱心網友回復:
您可以使用遞回函式來執行正確的事情 (tm),具體取決于其引數的型別:
#!/usr/bin/env perl
use warnings;
use strict;
use experimental qw/signatures/;
use Scalar::Util qw/blessed reftype/;
use Data::Dumper;
sub to_upper($var) {
die "Blessed objects aren't supported" if blessed $var;
my $type = reftype $var;
if (!defined $type) {
return uc $var;
} elsif ($type eq "ARRAY") {
return [ map { to_upper($_) } @$var ]
} elsif ($type eq "HASH") {
my %uchash;
while (my ($key, $val) = each %$var) {
$uchash{uc $key} = to_upper($val);
}
return \%uchash;
} elsif ($type eq "SCALAR") {
my $uc = uc $$var;
return \$uc;
} else {
die "Unsupported reference type $type";
}
}
my $var = {
'oracle' => {
'sit' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'ora:oraclepatching'
]
},
'prd' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'odg:oraclepatching',
'ora:oraclepatching'
]
},
'uat' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'odg:oraclepatching',
'ora:oraclepatching'
]
},
'PRD' => {
'ZQ01-42P-UXGROUP' => [
'socdbaud',
'oramgrp',
'wmioca',
'oramigration',
'tac'
]
}
}
};
my $ucvar = to_upper $var;
print Dumper($ucvar);
列印出來
$VAR1 = {
'ORACLE' => {
'PRD' => {
'ZQ01-42P-PBTOKEN' => [
'ORA:MORNINGCHECK',
'ORA:SIMPANA_BKP',
'ODG:ORACLEPATCHING',
'ORA:ORACLEPATCHING'
]
},
'UAT' => {
'ZQ01-42P-PBTOKEN' => [
'ORA:MORNINGCHECK',
'ORA:SIMPANA_BKP',
'ODG:ORACLEPATCHING',
'ORA:ORACLEPATCHING'
]
},
'SIT' => {
'ZQ01-42P-PBTOKEN' => [
'ORA:MORNINGCHECK',
'ORA:SIMPANA_BKP',
'ORA:ORACLEPATCHING'
]
}
}
};
(大寫的哈希鍵會導致重復,并且只保留其中一個)
uj5u.com熱心網友回復:
所需的對話可以通過將資料結構簡單轉換為 JSON 字串來實作,將 JSON 字串轉換為大寫,然后將字串轉換回資料結構。
use strict;
use warnings;
use JSON;
use Data::Dumper;
my($var,$data);
$var = {
'oracle' => {
'sit' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'ora:oraclepatching'
]
},
'prd' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'odg:oraclepatching',
'ora:oraclepatching'
]
},
'uat' => {
'ZQ01-42P-PBTOKEN' => [
'ora:morningcheck',
'ora:simpana_bkp',
'odg:oraclepatching',
'ora:oraclepatching'
]
},
'PRD' => {
'ZQ01-42P-UXGROUP' => [
'socdbaud',
'oramgrp',
'wmioca',
'oramigration',
'tac'
]
}
}
};
$data = uc to_json($var);
$data = from_json($data);
print Dumper($data);
輸出
$VAR1 = {
'ORACLE' => {
'SIT' => {
'ZQ01-42P-PBTOKEN' => [
'ORA:MORNINGCHECK',
'ORA:SIMPANA_BKP',
'ORA:ORACLEPATCHING'
]
},
'PRD' => {
'ZQ01-42P-PBTOKEN' => [
'ORA:MORNINGCHECK',
'ORA:SIMPANA_BKP',
'ODG:ORACLEPATCHING',
'ORA:ORACLEPATCHING'
]
},
'UAT' => {
'ZQ01-42P-PBTOKEN' => [
'ORA:MORNINGCHECK',
'ORA:SIMPANA_BKP',
'ODG:ORACLEPATCHING',
'ORA:ORACLEPATCHING'
]
}
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506227.html
標籤:perl
