【问题标题】:Match keys in a hash to return respective key+value in perl匹配哈希中的键以在 perl 中返回相应的键+值
【发布时间】:2017-04-18 22:00:50
【问题描述】:

我有一个哈希。我想通过匹配键的字符串模式来获取键和值。

例如,我有一个这样的哈希

 my %hash =  { FIELDN1 = > "N1", FIELDN2 => "N2", FIELDM1 => "M1", FILEDM2 =>"M2"}

我想得到下面给出的键中具有 1 的键和值。

{ FIELDN1 = > "N1", FIELDM1 => "M1" }

【问题讨论】:

  • 为什么要使用正则表达式?为什么不遍历键、哈希值并检查最后一个字符是否为数字 1?
  • @MohammadYusufGhazi:如果没有正则表达式,您如何检查最后一个字符是否为1?我无法想象比/1$/ 更清楚的事情了。相比之下,substr($_, -1) eq '1' 之类的东西非常笨拙。
  • 是的,我正在使用 python 范式讨论子字符串。我同意你的看法,在 perl 中使用正则表达式会好得多。

标签: regex perl hash


【解决方案1】:

如果您需要对应值满足要求的键,最好单独保存:

#!/usr/bin/env perl

use strict;
use warnings;

my %hash =  (
    FIELDN1 => "N1",
    FIELDN2 => "N2",
    FIELDM1 => "M1",
    FILEDM2 => "M2",
);

my @subset_keys = grep /1\z/, keys %hash;

my %subset;
@subset{ @subset_keys } = @hash{ @subset_keys };

# contrived example for needing the matching keys    
for my $k ( @subset_keys ) {
    print "$k = $subset{$k}\n";
}

如果您还想从%hash 中删除匹配的键,请使用:

@subset{ @subset_keys } = delete @hash{ @subset_keys };

或者,如果您只想从 %hash 中删除不匹配的条目:

delete @hash{ grep !/1\z/, keys %hash };

%hash 现在将包含:

--- FIELDM1: M1 FIELDN1: N1

【讨论】:

    【解决方案2】:

    按照你的要求做

    use strict;
    use warnings 'all';
    
    my %hash = ( FIELDN1 => "N1", FIELDN2 => "N2", FIELDM1 => "M1", FILEDM2 => "M2" );
    
    my %subset = map { $_ => $hash{$_} } grep { /1$/ } keys %hash;
    
    use Data::Dumper;
    print Dumper \%subset;
    

    输出

    $VAR1 = {
              'FIELDN1' => 'N1',
              'FIELDM1' => 'M1'
            };
    

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 1970-01-01
      • 2018-04-02
      • 2023-04-08
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多