Perl - 基于散列过滤器创建散列数组
Perl - Create Array of Hashes based on Hash filter
我有这个包含一些信息的散列:
my %hash = (
key_1 => {
year => 2000,
month => 02,
},
key_2 => {
year => 2000,
month => 02,
},
key_3 => {
year => 2000,
month => 03,
},
key_4 => {
year => 2000,
month => 05,
},
key_5 => {
year => 2000,
month => 01,
}
);
我不想创建一个哈希数组,其中每个数组元素都列出具有相同年份和月份的每个哈希 key/value 对。
所以基本上我想创建这样的东西:
$VAR1 = [
'key_1' => {
'month' => 2,
'year' => 2000
},
'key_2' => {
'month' => 2,
'year' => 2000
}
], [
'key_3' => {
'month' => 3,
'year' => 2000
}
], [
'key_4' => {
'month' => 3,
'year' => 2000
}
], [
'key_5' => {
'year' => 2000,
'month' => 1
}
];
这里真正的问题是:如何将哈希键键值与其他键键值进行比较并从中制作映射。
感谢您的宝贵时间! =)
我得到的结果略有不同 - key_3 和 key_4 应该属于同一组。
my %by_year_and_month;
undef $by_year_and_month{ $hash{$_}{year} }{ $hash{$_}{month} }{$_}
for keys %hash;
my $result;
for my $year (keys %by_year_and_month) {
for my $month (keys %{ $by_year_and_month{$year} }) {
push @$result, [ map { $_ => { month => $month, year => $year } }
keys %{ $by_year_and_month{$year}{$month} } ];
}
}
my %hash = (
key_1 => {year => 2000, month => 02},
key_2 => {year => 2000, month => 02},
key_3 => {year => 2000, month => 03},
key_4 => {year => 2000, month => 03},
key_5 => {year => 2000, month => 01}
);
my @v=qw(year month); # keys compared
my @k=sort keys %hash;
my(@a,%i);
push@{$a[sub{$i{join$;,map$_[0]{$_},@v}//=@a}->($hash{$_})]},($_=>$hash{$_}) for@k;
use Data::Dumper; print Dumper(\@a);
你说你想要下面的,但是没有意义。
$VAR1 = [$k,$v,$k,$v...], [...], [...], ...;
接受的答案假定您的意思是您想要以下内容:
$VAR1 = [ [$k,$v,$k,$v,...], [...], [...], ... ];
可以通过以下方式获取:
sub group_id { sprintf "%04d-%02d", @{ $_[0] }{qw( year month )} }
my %grouped;
for my $k (keys(%hash)) {
my $v = $hash{$k};
push @{ $grouped{ group_id($v) } }, $k, $v;
}
my $VAR1 = [ map { $grouped{$_} } sort keys %grouped ];
但这是一种非常奇怪的格式。以下内容更有意义:
$VAR1 = [ { $k=>$v,$k=>$v,...}, {...}, {...}, ... ];
可以通过以下方式获取:
sub group_id { sprintf "%04d-%02d", @{ $_[0] }{qw( year month )} }
my %grouped;
for my $k (keys(%hash)) {
my $v = $hash{$k};
$grouped{ group_id($v) }{$k} = $v;
}
my $VAR1 = [ map { $grouped{$_} } sort keys %grouped ];
在这两种情况下,关键是使用哈希对相似的事物进行分组。
在这两种情况下,生成的组均按时间顺序排列。
我有这个包含一些信息的散列:
my %hash = (
key_1 => {
year => 2000,
month => 02,
},
key_2 => {
year => 2000,
month => 02,
},
key_3 => {
year => 2000,
month => 03,
},
key_4 => {
year => 2000,
month => 05,
},
key_5 => {
year => 2000,
month => 01,
}
);
我不想创建一个哈希数组,其中每个数组元素都列出具有相同年份和月份的每个哈希 key/value 对。
所以基本上我想创建这样的东西:
$VAR1 = [
'key_1' => {
'month' => 2,
'year' => 2000
},
'key_2' => {
'month' => 2,
'year' => 2000
}
], [
'key_3' => {
'month' => 3,
'year' => 2000
}
], [
'key_4' => {
'month' => 3,
'year' => 2000
}
], [
'key_5' => {
'year' => 2000,
'month' => 1
}
];
这里真正的问题是:如何将哈希键键值与其他键键值进行比较并从中制作映射。
感谢您的宝贵时间! =)
我得到的结果略有不同 - key_3 和 key_4 应该属于同一组。
my %by_year_and_month;
undef $by_year_and_month{ $hash{$_}{year} }{ $hash{$_}{month} }{$_}
for keys %hash;
my $result;
for my $year (keys %by_year_and_month) {
for my $month (keys %{ $by_year_and_month{$year} }) {
push @$result, [ map { $_ => { month => $month, year => $year } }
keys %{ $by_year_and_month{$year}{$month} } ];
}
}
my %hash = (
key_1 => {year => 2000, month => 02},
key_2 => {year => 2000, month => 02},
key_3 => {year => 2000, month => 03},
key_4 => {year => 2000, month => 03},
key_5 => {year => 2000, month => 01}
);
my @v=qw(year month); # keys compared
my @k=sort keys %hash;
my(@a,%i);
push@{$a[sub{$i{join$;,map$_[0]{$_},@v}//=@a}->($hash{$_})]},($_=>$hash{$_}) for@k;
use Data::Dumper; print Dumper(\@a);
你说你想要下面的,但是没有意义。
$VAR1 = [$k,$v,$k,$v...], [...], [...], ...;
接受的答案假定您的意思是您想要以下内容:
$VAR1 = [ [$k,$v,$k,$v,...], [...], [...], ... ];
可以通过以下方式获取:
sub group_id { sprintf "%04d-%02d", @{ $_[0] }{qw( year month )} }
my %grouped;
for my $k (keys(%hash)) {
my $v = $hash{$k};
push @{ $grouped{ group_id($v) } }, $k, $v;
}
my $VAR1 = [ map { $grouped{$_} } sort keys %grouped ];
但这是一种非常奇怪的格式。以下内容更有意义:
$VAR1 = [ { $k=>$v,$k=>$v,...}, {...}, {...}, ... ];
可以通过以下方式获取:
sub group_id { sprintf "%04d-%02d", @{ $_[0] }{qw( year month )} }
my %grouped;
for my $k (keys(%hash)) {
my $v = $hash{$k};
$grouped{ group_id($v) }{$k} = $v;
}
my $VAR1 = [ map { $grouped{$_} } sort keys %grouped ];
在这两种情况下,关键是使用哈希对相似的事物进行分组。
在这两种情况下,生成的组均按时间顺序排列。