#!/usr/bin/perl use 5.010; use strict; use warnings; sub expensive_call { $_[0] == -1 ? undef : $_[0] } say $_ // "[undef]" for sort {expensive_call($a) <=> expensive_call($b)} 0,1,-1,-1,0,2; __END__ Use of uninitialized value in numeric comparison (<=>) at /tmp/s line 9. Use of uninitialized value in numeric comparison (<=>) at /tmp/s line 9. Use of uninitialized value in numeric comparison (<=>) at /tmp/s line 9. Use of uninitialized value in numeric comparison (<=>) at /tmp/s line 9. Use of uninitialized value in numeric comparison (<=>) at /tmp/s line 9. Use of uninitialized value in numeric comparison (<=>) at /tmp/s line 9. Use of uninitialized value in numeric comparison (<=>) at /tmp/s line 9. 0 -1 -1 0 1 2