Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl从哈希键字符串中提取字符_Perl - Fatal编程技术网

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
并进行迭代。感谢所有的指导和建议。我编辑了我的问题。如果可能,请分享你的想法。谢谢。谢谢你的指导和建议。我编辑了我的问题。如果可能,请分享你的想法。谢谢