[英]Perl: Splitting a hash into several based on its keys?
假设我有一个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]/
。
如果您能告诉我该怎么做(或提示我一些搜索关键字),我将不胜感激。
问候,
克里斯托弗·史密斯
我假设您的哈希引用是$foo_ref
。 您没有说明如果您的哈希键既不是foo
也不是bar
会发生什么。 您可以做以下三件事之一:
foo
键之一,所有其他键之一。 foo
键也不是bar
键的键。 (这就是我所做的)。 下面的程序:
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
my $foo_re = qr/^foo_/;
my $bar_re = qr/^bar_/;
my $foo_ref = {
foo_0 => "foo_zero",
foo_1 => "foo_one",
bar_0 => "bar_zero",
bar_1 => "bar_one",
};
my $bar_ref = {};
foreach my $key (keys %{$foo_ref}) {
if (not $key =~ $foo_re) {
# Remove if clause to store all non-foo keys in $bar_re
$bar_ref->{$key} = $foo_ref->{$key} if $key =~ $bar_re;
delete $foo_ref->{$key}
}
}
say Dumper $foo_ref;
say Dumper $bar_ref;
到目前为止,发布的其他解决方案可以工作,但是又快速又肮脏。 当输入模式更改时,需要更改它们,并且仅假设两个模式。 这种通用解决方案不受此困扰:它不需要更改,并且可以采用任何数量的模式。
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'
# }
# }
我假设您所有的哈希键都具有提供的2种模式之一。 如果没有,那么您应该更准确地指定您拥有的东西和期望的东西。
如果您要处理转储的输出,我还假定它具有适用于eval
的正确格式。 只需将您的输出放入q(
和)
:
# ...
my $VAR1;
eval q(
$VAR1 = {
foo_0 => 'foo_zero',
foo_1 => 'foo_one',
bar_0 => 'bar_zero',
bar_1 => 'bar_one'
}
);
my $h1 = {};
my $h2 = {};
for my $k ( keys %{$VAR1} ) {
if ( $k =~ /foo_\d/ ) {
$h1->{$k} = $VAR1->{$k};
next;
}
$h2->{$k} = $VAR1->{$k}; # the remaining /bar_\d/ case
}
# use your new $h1 and $h2 hasrefs
# ...
您将获得2个新的hasrefs $h1
和$h2
。
如果除了这2之外还有其他情况, if
将每个人都放入if
,而不仅仅是第一个。
这不是一个完整的脚本,只是一个片段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.