来自散列键字符串的perl strip字符

时间:2017-05-29 10:26:17

标签: 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.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'],

感谢。

5 个答案:

答案 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);