我一直在寻找一种使用 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/