首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散列键字符串中的perl带字符

散列键字符串中的perl带字符
EN

Stack Overflow用户
提问于 2017-05-29 10:26:17
回答 5查看 115关注 0票数 0

下面是我的哈希。

代码语言:javascript
复制
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用更多的键/值编辑了我的散列。例如

代码语言:javascript
复制
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',‘介于’,

谢谢。

EN

回答 5

Stack Overflow用户

发布于 2017-05-29 11:00:04

您的第一个想法可能是迭代哈希(使用keys()each()),删除以'X‘结尾的键,然后用剥离的版本替换它们。这是一个糟糕的想法,因为您不应该在迭代过程中更改散列。所以别那么做。

最好的方法是将更改的键/值对写入新的哈希。但是,完全有可能将这些新的对写回原来的散列中,如下所示:

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2017-05-29 11:22:48

您可以简单地删除每个元素并将其添加回键中删除的X

此示例效率低下,因为它还删除和替换了键不以X结尾的未更改的元素,但作为一次操作,这将是微不足道的,除非您拥有大量的元素。

我只使用Data::Dumper来显示结果数据结构。对Data::Dumper的任何提及都可能从最终代码中删除。

代码语言:javascript
复制
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;

输出

代码语言:javascript
复制
{
    '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
EN

Stack Overflow用户

发布于 2017-05-29 20:05:10

您可以使用将转换回调作为参数的函数,

代码语言:javascript
复制
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;

输出

代码语言:javascript
复制
$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'
                          ]
    };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44240197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档