我有一个接受用户输入的功能.输入可以是整数,浮点数或字符串.我有三个重载函数,应根据输入数据的DATA TYPE调用.例如,如果用户输入整数(例如100),则应调用具有整数参数的函数.如果用户输入字符串(例如"100"),则应调用具有字符串参数的函数.
所以我需要找出输入数据的数据类型.使用正则表达式,我能够区分整数和浮点数(因为我只需要找出类型,我不喜欢使用cpan.org提供的库),但我无法弄清楚如何区分字符串中的整数.Perl对待"100"和100对待?有没有办法解决这个问题?
Bri*_*ard 11
来自perldoc perldata:
标量不一定是一回事.没有地方可以将标量变量声明为"string"类型,键入"number",键入"reference"或其他任何内容.由于标量的自动转换,返回标量的操作无需关心(事实上,无关心)其调用者是否正在查找字符串,数字或引用.Perl是一种上下文多态语言,其标量可以是字符串,数字或引用(包括对象).尽管几乎所有目的都认为字符串和数字几乎相同,但引用是强类型的,带有内置引用计数和析构函数调用的uncastable指针.
因此,对于整数标量,您只需要提前决定如何处理它们.根据上下文,Perl会愉快地从数字转换为字符串,反之亦然.
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
Run Code Online (Sandbox Code Playgroud)
由于您正在将Perl变量映射到C函数,您可以编写如下内容:
sub myfunction {
if (looks_like_number($_[0]) {
if ($_[0] =~ /\D/) {C_float($_[0])}
else { C_int($_[0])}
}
else {C_string($_[0])}
}
Run Code Online (Sandbox Code Playgroud)
在给出Perl标量时,哪个应该"做正确的事".您可能还想添加一个检查以查看参数是否为引用,然后以不同方式处理该情况.