You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:45:52