在 python 中,我可以执行以下操作以获取具有特定属性的列表中的所有对象。在这个例子中,我获取列表 objs
中每个 obj
的 id
字段列表,其中 obj.id
更大超过 100:
ids = [ obj.id for obj in objs if obj.id > 100]
我如何在 perl 中做同样的事情?我想我想使用 map
,但我不知道如何有条件地将项从源集映射到目标集。
最佳答案
map
block 可以为原始列表中的每个元素返回 0 个或多个元素。要省略一个元素,只需返回空列表 ()
:
my @ids = map { $_->id > 100 ? $_->id : () } @objs;
这假定 @objs
中的对象具有 id
属性和关联的访问器。如果您想要直接哈希访问,您也可以这样做:
my @ids = map { $_->{id} > 100 ? $_->{id} : () } @objs;
或者,您可以只组合 map
和 grep
:
my @ids = map { $_->id } grep { $_->id > 100 } @objs;
# Or reverse the order to avoid calling $_->id twice:
my @ids = grep { $_ > 100 } map { $_->id } @objs;
我不确定哪一个会更有效率,但除非 @objs
真的很大,否则这不太重要。
如果您从对象中提取的值的计算成本很高,那么您可以缓存该值以进行测试并返回值:
my @vals = map { my $v = $_->expensive_method; $v > 100 ? $v : () } @objs;
关于python - Perl 等同于 Python 的列表理解与嵌入式 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753969/