use List::Util qw[ first ];; use List::MoreUtils qw[ first_value ];; sub x{ say "<<<@_>>>"; return shift(); };; $x = grep{ defined( x($_) ) } 1, undef,3;; <<<1>>> Use of uninitialized value in join or string at (eval 17) line 1, line 10. <<<>>> <<<3>>> $x = first{ defined( x( $_ ) ) } 1, undef, 3;; <<<1>>> $x = first_value{ defined( x( $_ ) ) } 1, undef, 3;; <<<1>>>