regex - Perl:根据键将散列分成几个?

标签 regex perl hashtable

假设我有一个 hashref,其 Data::Dumper 输出如下所示:


    $VAR1 = {
        foo_0 => 'foo_zero',
        foo_1 => 'foo_one',
        bar_0 => 'bar_zero',
        bar_1 => 'bar_one'
    }

我想根据其键将这个哈希分成两个,如下所示,但我不知道如何执行此操作:


    $VAR1 = {
        foo_0 => 'foo_zero',
        foo_1 => 'foo_one'
    },
    $VAR2 = {
        bar_0 => 'bar_zero',
        bar_1 => 'bar_one'
    }

第一个哈希的键匹配 /foo_[\d]/,而第二个哈希的键匹配 /bar_[\d]/

如果您能告诉我如何执行此操作(或提示我一些搜索关键字),我将不胜感激。

问候,
克里斯托弗·史密斯

最佳答案

到目前为止发布的其他解决方案可以工作,但是快速且肮脏。当输入模式改变时它们需要改变,并且假设只有两种模式。这个通用解决方案不会受到这个问题的影响:它不需要改变,并且需要任意数量的模式。

sub classify_hashref {
    my ($href, %p) = @_;
    my $r;
    for my $hkey (keys %{ $href }) {
        for my $pkey (keys %p) {
            $r->{$pkey}{$hkey} = $href->{$hkey}
                if $hkey =~ $p{$pkey};
        }
    }
    return $r;
}

my $h = {
    foo_0 => 'foo_zero',
    foo_1 => 'foo_one',
    bar_0 => 'bar_zero',
    bar_1 => 'bar_one'
};
classify_hashref($h, foo_like => qr/^foo_/, looks_like_bar => qr/^bar_/);
# {
#     looks_like_bar => {
#         bar_0 => 'bar_zero',
#         bar_1 => 'bar_one'
#     },
#     foo_like => {
#         foo_0 => 'foo_zero',
#         foo_1 => 'foo_one'
#     }
# }

关于regex - Perl:根据键将散列分成几个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645350/

相关文章:

php - 在PHP中将字符串拆分为数组的最快方法

perl - Perl 中的 sub _init 解释

java - 如何保持Hashtable中键的固定顺序?

Python 2.7 和正则表达式 : False if statement returns

用于解析存储过程和提取元数据的 C# 脚本

perl - CPAN 模块中的 `eval` ing 没有本地化 $@ 是一个错误吗?

multithreading - 在Perl中同时使用线程和Parallel::ForkManager的阻塞问题

java - 删除时哈希表重新哈希

java - 如何从 mongodb 中检索 Hashtable?

regex - Bash 字符串比较/前导零