The map block can return 0 or more elements for each element in the original list. To omit an element, just return the empty list ():
my @ids = map { $_->id > 100 ? $_->id : () } @objs;
This assumes that the objects in @objs have an id attribute and associated accessor. If you want direct hash access, you can do that too:
my @ids = map { $_->{id} > 100 ? $_->{id} : () } @objs;
Or, you can just combine map and 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;
I'm not sure which of those would be more efficient, but unless @objs is really big, that's unlikely to matter much.
If the value you're extracting from the object is expensive to calculate, then you can cache the value for the test and return value:
my @vals = map { my $v = $_->expensive_method; $v > 100 ? $v : () } @objs;