我正在寻找的方式来表达在Perl这段Python代码片段:
data = {"A": None, "B": "yes", "C": None}
key_list = [k for k in data if data[k]]
# in this case the same as filter(lambda k: data[k], data) but let's ignore that
所以,看它的一种方式,我只是想在那里的值是无或民主基金的关键。 看着它的另一种方式,我要的是简洁的perl相当于的使用条件列表理解 。
我想你想grep
:
#!/usr/bin/env perl
use strict;
use warnings;
my %data = ( A => undef, B => 'yes', C => undef );
my @keys = grep { defined $data{$_} } keys %data;
print "Key: $_\n" for @keys;
我也认为我型太慢,那我应该张贴答案之前重新加载页面。 顺便说一句,无论是值0
或undef
可以处理空值的好方法,但一定要记住,你正在使用。 假值,和值未定义不是在Perl同样的事情。 为了澄清: undef
在布尔测试返回false,但这样做0
。 如果0
是一个有效的值,那么你要明确地测试definedness,而不是简单的道理。 (我说出来,因为詹姆斯去了0
和我去的其他方式,你可能会或可能不知道它的问题。)
使用grep的 :
#!/usr/bin/perl
use strict;
use warnings;
my %data = ("A" => 0, "B" => "yes", "C" => 0 );
my @keys = grep { $data{$_} } keys %data;
grep的从在右侧为其在括号中的表达式的计算结果为真值的列表中返回的值。 作为特勒马库斯指出,要确保你了解在Perl真/假值。 这个问题有真理的Perl中的一个很好的概述。
你可能会想看看地图 ,这在大括号适用表达式到列表中的每个元素并返回结果。 一个例子是:
my @data = ("A" => 0, "B" => 1, "C" => 0 );
my @modified_data = map { $data{$_} + 1 } @data;
print join ' ', @data, "\n";
print join ' ', @modified_data, "\n";
有关主题的变化看一下autobox (见它的实现autobox ::核心和驼鹿:: Autobox )
use autobox::Core;
my %data = ( A => undef, B => 'yes', C => undef );
my $key_list = %data->keys->grep( sub { defined $data{$_} } );
say "Key: $_" for @$key_list;
# => Key: B
穆斯:: Autobox带有键/值“KV”,这使得代码机:
my $key_list = %data->kv->grep( sub{ defined $_->[1] } )->map( sub{ $_->[0] } );
这里是上面更明确,甚至更长的版本:
my $key_list = %data->kv
->grep( sub { my ($k, $v) = @$_; defined $v } )
->map( sub { my ($k, $v) = @$_; $k } );