perl从哈希键字符串中提取字符
下面是我的杂烩perl从哈希键字符串中提取字符,perl,Perl,下面是我的杂烩 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.4
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和FA1.200.3.4X——理想情况下,这两个键都是相同的标识符,后面的键中附加了“X”。因此,我们可以像从最后一个剥离X一样处理,并在单个键/值中映射值FA1.200.3.4和FA1.200.3.4X吗
FA1.200.3.4=>
谢谢。我认为没有办法做到这一点。您必须迭代密钥,并用修改/固定的密钥填充新的哈希表。我认为没有办法做到这一点。您必须迭代密钥,并使用修改/固定的密钥填充新的哈希表。最好的方法是使用新密钥创建新的哈希表,如以下代码段所示:
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);
最好的方法是使用新键创建一个新哈希,如以下代码段所示:
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);
您的第一个想法可能是迭代散列(使用
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;
您的第一个想法可能是迭代散列(使用
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;
您只需删除每个元素,然后在从键中删除
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;
输出
您只需删除每个元素,然后在从键中删除
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;
输出
您可以使用将转换回调作为参数的函数
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'
]
};
您可以使用将转换回调作为参数的函数
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'
]
};
你的帖子很好,简短:)感谢这个带有“map”的解决方案。@DaveCross:while/
每个
,你的谨慎是适当的,但是键和值都会生成一个静态列表并对其进行迭代,因此这种方法是安全的。如果你想完全确定这一点,那么当然你可以写my@keys=keys%HoA
并反复阅读。你的帖子很好,简短:)感谢这个带有“map”的解决方案。@DaveCross:你的谨慎适用于,而/每个,但是键
和值
都会生成一个静态列表并对其进行迭代,因此这种方法是安全的。如果您希望完全确定这一点,那么您当然可以编写my@keys=keys%HoA
并进行迭代。感谢所有的指导和建议。我编辑了我的问题。如果可能,请分享你的想法。谢谢。谢谢你的指导和建议。我编辑了我的问题。如果可能,请分享你的想法。谢谢