Perl не делает полезного различия между числами и строковыми представлениями этих чисел. Твой сценарий тоже не должен. Вы могли бы написать некоторый код, чтобы различать вещи, которые выглядят как целые числа и числа с плавающей запятой, но единственный способ узнать, является ли это строкой, это если скаляр не выглядит как целое число или число с плавающей запятой.
Вот простая процедура, которая возвращает int
, rat
или str
в качестве аргумента. Обратите внимание, что 100
и '100'
оба int
, но что-то вроде 'asdf'
будет str
.
use Scalar::Util 'looks_like_number';
sub guess_type {
looks_like_number($_[0]) ? $_[0] =~ /\D/ ? 'rat' : 'int' : 'str'
}
say guess_type 1; # int
say guess_type "1"; # int
say guess_type 1.1; # rat
say guess_type 'asdf'; # str
Поскольку вы работаете над отображением переменных Perl в функции C, вы можете написать что-то вроде этого:
sub myfunction {
if (looks_like_number($_[0]) {
if ($_[0] =~ /\D/) {C_float($_[0])}
else { C_int($_[0])}
}
else {C_string($_[0])}
}
Который должен "делать правильные вещи", когда ему дан скаляр Perl. Вы также можете добавить проверку, чтобы убедиться, что аргумент является ссылкой, а затем обработать этот случай по-другому.