下面是我的哈希。
my %HoA= (
HU1.2.3.4X => [ 'hamnet', 'shakespeare', 'robyn', ],
HU1.2.3.4 => [ 'apple', 'oranges', 'grapes', ],
PU1000.2.003.4X => [ 'hamnet', 'shakespeare', 'robyn', ],
FA1.200.3.4 => [ 'oberon', 'titania', 'puck', ],
FA1.200.3.4X => [ 'between' ],
OT100.2.30.4 => [ 'morpheus, lord of dreams' ],
);我需要从键的末尾去掉"X“,所以如果我从HU1.2.3.4X中删除"X”,我需要有键值HU1.2.3.4,以便以后在脚本中打印key/value。
请帮我一下。谢谢。
UPDATE用更多的键/值编辑了我的散列。例如
FA1.200.3.4 => [ 'oberon', 'titania', 'puck', ],
FA1.200.3.4X => [ 'between' ],这里的键是FA1.200.3.4和FA1.200.3.4X -理想情况下,这两个键都是相同的标识符,后面的键中添加了"X“。因此,我们能不能像从最后一个剥离X,并映射值FA1.200.3.4和FA1.200.3.4X单键/值
=> 'oberon','titania','puck',‘介于’,
谢谢。
发布于 2017-05-29 11:00:04
您的第一个想法可能是迭代哈希(使用keys()或each()),删除以'X‘结尾的键,然后用剥离的版本替换它们。这是一个糟糕的想法,因为您不应该在迭代过程中更改散列。所以别那么做。
最好的方法是将更改的键/值对写入新的哈希。但是,完全有可能将这些新的对写回原来的散列中,如下所示:
use feature 'say';
use Data::Dumper;
my %HoA = (
'HU1.2.3.4X' => [ 'hamnet', 'shakespeare', 'robyn', ],
'PU1000.2.003.4X' => [ 'hamnet', 'shakespeare', 'robyn', ],
'FA1.200.3.4' => [ 'oberon', 'titania', 'puck', ],
'OT100.2.30.4' => [ 'morpheus, lord of dreams' ],
);
%HoA = map { my $v = $HoA{$_}; s/X$//; $_ => $v } keys %HoA;
say Dumper \%HoA;发布于 2017-05-29 11:22:48
您可以简单地删除每个元素并将其添加回键中删除的X。
此示例效率低下,因为它还删除和替换了键不以X结尾的未更改的元素,但作为一次操作,这将是微不足道的,除非您拥有大量的元素。
我只使用Data::Dumper来显示结果数据结构。对Data::Dumper的任何提及都可能从最终代码中删除。
use strict;
use warnings 'all';
use Data::Dumper;
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 1;
my %HoA = (
'HU1.2.3.4X' => [ 'hamnet', 'shakespeare', 'robyn', ],
'PU1000.2.003.4X' => [ 'hamnet', 'shakespeare', 'robyn', ],
'FA1.200.3.4' => [ 'oberon', 'titania', 'puck', ],
'OT100.2.30.4' => [ 'morpheus, lord of dreams', ],
);
$HoA{ s/X\z//r } = delete $HoA{$_} for keys %HoA;
print Dumper \%HoA;输出
{
'OT100.2.30.4' => [
'morpheus, lord of dreams'
],
'PU1000.2.003.4' => [
'hamnet',
'shakespeare',
'robyn'
],
'FA1.200.3.4' => [
'oberon',
'titania',
'puck'
],
'HU1.2.3.4' => [
'hamnet',
'shakespeare',
'robyn'
]
}发布于 2017-05-29 20:05:10
您可以使用将转换回调作为参数的函数,
use Data::Dumper;
my %HoA = (
'HU1.2.3.4X' => [ 'hamnet', 'shakespeare', 'robyn', ],
'PU1000.2.003.4X' => [ 'hamnet', 'shakespeare', 'robyn', ],
'FA1.200.3.4' => [ 'oberon', 'titania', 'puck', ],
'OT100.2.30.4' => [ 'morpheus, lord of dreams' ],
);
sub ren_hkeys {
my ($href, $f) = @_;
my @arr = keys %$href;
@$href{ map $f->(), @arr } = delete @$href{ @arr };
}
ren_hkeys(\%HoA, sub{ s/X$//r });
print Dumper \%HoA;输出
$VAR1 = {
'OT100.2.30.4' => [
'morpheus, lord of dreams'
],
'FA1.200.3.4' => [
'oberon',
'titania',
'puck'
],
'HU1.2.3.4' => [
'hamnet',
'shakespeare',
'robyn'
],
'PU1000.2.003.4' => [
'hamnet',
'shakespeare',
'robyn'
]
};https://stackoverflow.com/questions/44240197
复制相似问题