$ perl -wE' sub expensive_call { $_[0] == -1 ? undef : $_[0] } say $_ // "[undef]" for sort { ( $c{$a} //= expensive_call($a) ) <=> ( $c{$b} //= expensive_call($b) ) } 0,1,-1,-1,0,2; ' Use of uninitialized value $c{"-1"} in numeric comparison (<=>) at -e line 3. Use of uninitialized value $c{"-1"} in numeric comparison (<=>) at -e line 3. Use of uninitialized value $c{"-1"} in numeric comparison (<=>) at -e line 3. Use of uninitialized value $c{"-1"} in numeric comparison (<=>) at -e line 3. Use of uninitialized value $c{"-1"} in numeric comparison (<=>) at -e line 3. Use of uninitialized value $c{"-1"} in numeric comparison (<=>) at -e line 3. Use of uninitialized value $c{"-1"} in numeric comparison (<=>) at -e line 3. 0 -1 -1 0 1 2 #### $ perl -wE' sub expensive_call { $_[0] == -1 ? undef : $_[0] } say $_ // "[undef]" for sort { ( $c{$a} ||= expensive_call($a) // -1 ) <=> ( $c{$b} ||= expensive_call($b) // -1 ) } 0,1,-1,-1,0,2; ' -1 -1 0 0 1 2