下面是我的哈希。
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以便以后打印键/值在我的脚本中。
对此有任何帮助。感谢。
更新 使用更多键/值编辑我的哈希。例如
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映射到单个键/值
FA1.200.3.4 => ['oberon','titania','puck','between'],
感谢。
答案 0 :(得分:2)
您的第一个想法可能是迭代哈希(使用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;
答案 1 :(得分:2)
您只需删除每个元素,然后将其从密钥
中删除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'
]
}
答案 2 :(得分:1)
您可以使用将转换回调作为参数的函数
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'
]
};
答案 3 :(得分:-1)
我认为有一种方法可以将其制作到位。您将不得不迭代密钥,并使用修改/固定密钥填充新的哈希表。
答案 4 :(得分:-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' ],
);
my %HoA_new;
foreach my $key( keys %HoA) {
if( $key =~ m/.*?X$/) {
# save the value
my $value = $HoA{$key};
# split the key
$key =~ s/(.*?)X$//g;
# save value with new key
$HoA_new{$1} = $value;
} else {
$HoA_new{$key} = $HoA{$key};
}
}
print Dumper(\%HoA_new);