perl - 使用map提取匹配指定值的(key, value)哈希集

标签 perl map extraction

我一直在寻找一种使用 perl 函数执行以下操作的方法 map :
给定一个散列,我想提取值等于或匹配指定参数的对(键,值)。

在我的示例中,我想提取 (key, value) 对,其中 value = failed ,但它也可以是一个表达式(即以 A 开头的字符串,或一个 REGEX)。这就是为什么我想要一个散列,而不仅仅是一个匹配值的键表。

my %strings = (
    bla => "success",
    ble => "failed",
    bli => "failed",
    foo => "success",
    blo => "failed",
    bar => "failed",
    blu => "success"
);

my %failed_s = ();

while (my ($k, $v) = each %strings) {
    if ( $v eq 'failed' ) {$failed_s{$k} = $v};
};

我尝试了几种方法来做到这一点,但没有很好的结果,所以我想我对引用资料、做作、结果等感到困惑。
my %failed_s = 
    map { { $_ => $strings{$_} } 
    if ( $strings{$_}./failed/ ) } 
    keys %strings;
my %failed_s = 
    map { ( $strings{$_} eq 'failed') &&
          ($_, $strings{$_}) } 
    keys %strings;

print "Dumper \%failed_s: \n" . Dumper(\%failed_s);

在这种情况下,使用 map 可能是不可能的或无效的,但它会帮助我(可能还有其他人)知道原因。

最佳答案

Perl 可以轻松访问散列逻辑,以至于很少有人能够将键值对概念与其最常见的实现:散列区分开来。

因此,当大多数 Perler 想到 KVP 时,他们会想到“哈希”。但是想想 Perl 数组是 1) 列表、2) 队列和 3) 堆栈的方式,你会发现实现并不完全等同于概念。

我看到需要以散列之外的方式处理对,所以我创建了自己的库,我打算将其上传到 CPAN,直到我找到 List::Pairwise 已经在那了。

(当然好像没有我的“hash拼接”方法...)

无论如何,使用 List::Pairwise ,你只需

use List::Pairwise qw<grepp>;
my %failed_s = grepp { $b eq 'failed' } %strings;

当我说“看看这有多简洁!”时,我感觉自己像个电视广告人。

关于perl - 使用map提取匹配指定值的(key, value)哈希集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5597542/

相关文章:

正则表达式 : replace multiple groups with unknown groups number

无法在cgi中执行外部命令

scala - Scala Group通过保留插入顺序?

关键词提取软件

regex - 什么文本编辑器支持将找到的结果提取到另一个文件中?

perl - Perl 数据结构的简单、现代、健壮、透明的持久性

linux - 从 shell 脚本调用脚本 - 找不到获取命令

map - Clojure,将一个函数映射到两个参数,一个参数是固定的,另一个从列表中获取

java - 遍历 map 并更改值时如何避免 ConcurrentModificationException?

caffe - 如何提取网络的权重?