#! /usr/bin/perl use strict; use warnings; my $f = sub { return @_ == 1 ? undef : ( [ splice @_, -2 ], @_ == 1 ? () : &{ $_[0] }(@_) ); }; map { print "$_->[0] -> $_->[1]\n" } $f->( $f, %{ { x => 5, y => 8, z => 42 } } );