Первоначальный вопрос заключался в том, как определить, является ли переменная числовой, а не «имеет ли она числовое значение».
Есть несколько операторов, которые имеют отдельные режимы работы для числовых и строковых операндов, где "числовой" означает все, что изначально было числом или когда-либо использовалось в числовом контексте (например $x = "123"; 0+$x
, перед сложением $x
это строка, а затем считается числовым).
Один из способов сказать это:
if ( length( do { no warnings "numeric"; $x & "" } ) ) {
print "$x is numeric\n";
}
Если включена побитовая функция, которая создает &
только числовой оператор и добавляет отдельный строковый &.
оператор, вы должны отключить ее:
if ( length( do { no if $] >= 5.022, "feature", "bitwise"; no warnings "numeric"; $x & "" } ) ) {
print "$x is numeric\n";
}
(побитовое доступно в Perl 5.022 и выше и включено по умолчанию, если вы use 5.028;
или выше.)
perldoc perlapi
говорит нам: проверьте, выглядит ли содержимое SV как число (или как число). «Inf» и «Infinity» обрабатываются как числа (поэтому не будут выдавать нечисловые предупреждения), даже если ваш atof () не распознает их. Едва ли проверяемая спецификация ...