my @data = (-123.004,-.008,0,-0,.0987,1.0,12345,'d','test'); foreach my $value (@data){ $value = char_test($value); if ( $value =~/-?(\d?|\d+)\.?(\d?|\d+)/ && $value ne 'error' ){ print "true\n"; } else{ print "false\n"; } } sub char_test{ my $value = shift; my @chars = $value =~/\D/g; foreach my $char (@chars){ if ($char ne '-' && $char ne '.'){ return 'error'; } } return $value; } OUTPUT: true true true true true true true false false