my $gimme = $fh ? sub { <$fh> } : sub { pop @array }; ... while (defined($x = &$gimme)) { ... }