I would strongly favor using the abs() function. One of the issues here is that if you have a statement like
no warnings 'numeric';, then there should be some comments explaining why that is. abs() requires no explanation.
As far as speed with Perl, I am betting that abs() is really fast - this is not a complex operation for a 2's complement number. Don't know that Perl would be "smart" enough to do this asm code, but this is very fast because no branches to stall the instruction pipe.
; abs(eax), with no branches.
; intel syntax (dest, src)
mov ebx, eax ; save copy of eax
neg eax
cmovl eax, ebx ; if eax is now negative, restore its saved value