如何在Perl中将混合HoH/数组的完整数据结构转为大写?
Perl 深度转换哈希嵌套结构(含数组)为大写
问题分析
你原来的代码%ds = map uc, %ds之所以失败,是因为map会把哈希的键和值逐个处理:键会被转成大写,但值如果是哈希引用(比如{ 'sit' => ... }),uc会将其强制转为字符串形式(如HASH(0X2941738)),然后转大写,完全没有处理嵌套的内部结构。要实现全结构转大写,必须递归遍历每个层级,处理哈希的键、哈希的值、数组的元素。
解决方案:递归转换函数
写一个递归子函数,自动识别哈希引用、数组引用和普通字符串,逐层转换为大写:
sub deep_uc { my $val = shift; # 处理哈希引用:键转大写,值递归处理 if (ref $val eq 'HASH') { return { map { uc($_) => deep_uc($val->{$_}) } keys %$val }; } # 处理数组引用:每个元素递归处理 elsif (ref $val eq 'ARRAY') { return [ map { deep_uc($_) } @$val ]; } # 普通字符串直接转大写 else { return uc($val); } }
使用方法
调用这个函数处理你的哈希:
# 生成转换后的新结构(不修改原哈希) my $uc_ds = deep_uc(\%ds); # 如果需要直接替换原哈希 %ds = %{ deep_uc(\%ds) };
效果验证
以你提供的示例数据为例,转换后会得到:
'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' ] } }
所有键和字符串值都会被转为大写,嵌套结构完全保留。
内容的提问来源于stack exchange,提问作者olivierg
相关产品推荐
相关产品推荐

