# Your code # Pure sub walk_and_do { my $self = shift; my $rc = 1; foreach my $child (@{$self->children}) { $rc = $child->walk_and_do; last unless $rc; } unless ($rc) { $rc = $self->do_my_stuff; } return $rc; } # Same function, single return, just as clear (for me) # ala TIMTOWTDI sub walk_and_do { my($self,$flag,@return); $self = shift; for ( @{$self->childer} ) { (last && $flag = "$_->{err}") unless $_->walk_and_do; } if ($flag) { @return = ('0', "$flag); } else { @return = $self->do_my_stuff || ('0', $self->{err}); } return(@return); }# END sub walk_and_do