Scalar::Util looks_like_number представляется обычно рекомендуемым способом определения, является ли строка числом.
Почему он считает строку "0 but true" числом?
use Scalar::Util 'looks_like_number';
print looks_like_number("0 but true"); # 1