我想知道是否有一种简单的方法可以将完整的数据结构(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'
]
Run Code Online (Sandbox Code Playgroud)
我想要 uc() 中的所有内容(键和值),有没有一种巧妙的方法可以做到这一点?
我尝试了这个,但失败了(之后我得到:'ORACLE'=>'HASH(0X2941738)')
%ds = map uc, %ds;
Run Code Online (Sandbox Code Playgroud)
感谢您的任何提示!
您可以使用递归函数,根据其参数的类型执行正确的操作 (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);
Run Code Online (Sandbox Code Playgroud)
打印出来
$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'
]
}
}
};
Run Code Online (Sandbox Code Playgroud)
(散列键的大写会导致重复,并且只保留其中一个)