use strict; use warnings; use feature qw( say ); sub _write { my ( $err, $num ) = @_; say "$err, $num"; } my %data; $data{error} = ""; _write( $data{error} || 0, 42 ); $data{error} = "foo bar"; _write( $data{error} || 0, 42 ); $data{error} = "foo baz"; _write( $data{error} or 0, 42 ); # <-- fails __END__ 0, 42 foo bar, 42 Use of uninitialized value $num in concatenation (.) or string at i line 7. foo baz,