Блок map
может возвращать 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;