【问题标题】:Replace MULTIPLE first keys of multi-dimensional Hash in perl在perl中替换多维哈希的MULTIPLE第一个键
【发布时间】:2020-10-20 12:06:30
【问题描述】:

继我问过的一个类似问题 (Change first key of multi-dimensional Hash in perl) 之后,我在 perl 中有一个多维散列,并且想更改 MULTIPLE 第一个键以获得所选值。例如,我有哈希

my %Hash1;
$Hash1{1}{12}=1;
$Hash1{1}{10}=1;
$Hash1{2}{31}=1;
$Hash1{3}{52}=1;
$Hash1{3}{58}=1;
$Hash1{4}{82}=1;
$Hash1{4}{154}=1;

现在我想用值 300 替换第一个键中的值 3 和 4。之后我会得到:

$Hash1{1}{12}=1;
$Hash1{1}{10}=1;
$Hash1{2}{31}=1;
$Hash1{300}{52}=1;
$Hash1{300}{58}=1;
$Hash1{300}{82}=1;
$Hash1{300}{154}=1;

我知道我可以通过扫描原始散列并执行以下操作来创建新散列:

my %Hash2;
foreach my $key1 (sort keys %Hash1) {
    foreach my $key2 (keys %{ $Hash1{$key1} }) {
        if($key1==3 || $key1==4){
            $Hash2{300}{$key2}=1;
        } else {
            $Hash2{$key1}{$key2}=1;
        }
    }
}

但是有更快的方法吗?

【问题讨论】:

    标签: perl hash


    【解决方案1】:
    $Hash1{300} = {%{$Hash1{3}},%{$Hash1{4}}};
    delete $Hash1{3};
    delete $Hash1{4};
    

    【讨论】:

    • $Hash1{300} = {%{delete $Hash1{3}},%{delete $Hash1{4}}};
    • 你是绝对正确的。不过,我相信冗长的代码更具可读性。
    • 或者只用一个替换两个删除:delete @Hash1{3,4};
    【解决方案2】:

    如果您需要更换的按键过多,以下功能可能会有所帮助。

    replace_first_keys( \%Hash1, [ 3, 4 ], 300 ); 一样使用它。这三个参数分别是要修改的哈希引用要替换的键数组的引用替换键

    use List::Util;
    
    # REPLACE FIRST KEYS OF $hash LISTED IN @$replace WITH THE KEY $replacement    
    sub replace_first_keys {
        my ( $hash, $replace, $replacement ) = @_;
        unshift @$replace, $replacement if exists $hash->{$replacement};
        $hash->{$replacement} = {
            map { %{ delete $hash->{$_} } }
              grep { ( exists $hash->{$_} ) && ( ref $hash->{$_} eq 'HASH' ) }
              ( List::Util::uniq @$replace )
        };
        $hash;
    }
    

    它还尝试明智地处理以下情况:

    • replace_first_keys( \%Hash1, [ 3, 4 ], 2 );(替换键存在,旧值在冲突时被覆盖)
    • replace_first_keys( \%Hash1, [ 3, 4 ], 4 );(替换也出现在替换列表中)

    如果您想对此进行测试,请使用此 script

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-30
      • 2010-12-02
      • 2012-09-06
      • 1970-01-01
      • 2015-01-20
      • 2015-04-29
      • 2012-02-01
      相关资源
      最近更新 更多