sub do_thing { my ($partners,$item,$action) = @_; while ( (my $key, my $value) = each %$partners) { if ($item eq $key) { $action->($key,$value) } } } do_thing(\%partners,$item,sub { my ($key,$value) = @_; ($partners,$email,$nickname,$realname,$postcode,$phone) = (@$value); push (@allmembers, $item); my @partners_split = split / /, $partners; push (@allmembers, @partners_split); }); # and then, you can do other things: do_thing(\%partners,$item,sub { my ($key,$value) = @_; # do other stuff with %partners, $item, $key, $value, etc });