在Perl中查找标量变量的数据类型
我有一个接受用户输入的函数。输入可以是整数、浮点或字符串。我有三个重载函数,应该根据输入数据的数据类型调用它们。例如,如果用户输入一个整数(比如100),则应该调用具有integer参数的函数。如果用户输入字符串(例如“100”),则应调用具有字符串参数的函数在Perl中查找标量变量的数据类型,perl,Perl,我有一个接受用户输入的函数。输入可以是整数、浮点或字符串。我有三个重载函数,应该根据输入数据的数据类型调用它们。例如,如果用户输入一个整数(比如100),则应该调用具有integer参数的函数。如果用户输入字符串(例如“100”),则应调用具有字符串参数的函数 所以我需要找出输入数据的数据类型。使用正则表达式,我能够区分整数和浮点(因为我只需要找出类型,我不喜欢使用cpan.org提供的库),但我无法找出如何区分整数和字符串。Perl将“100”和100视为相同的吗?有办法解决这个问题吗?来自p
所以我需要找出输入数据的数据类型。使用正则表达式,我能够区分整数和浮点(因为我只需要找出类型,我不喜欢使用cpan.org提供的库),但我无法找出如何区分整数和字符串。Perl将“100”和100视为相同的吗?有办法解决这个问题吗?来自
perldoc perldata
:
标量不一定是这样或那样。没有地方可以将标量变量声明为“string”类型、“number”类型、“reference”类型或任何其他类型。由于标量的自动转换,返回标量的操作不需要关心(事实上,不能关心)它们的调用者是在寻找字符串、数字还是引用。Perl是一种上下文多态语言,其标量可以是字符串、数字或引用(包括对象)。尽管字符串和数字在几乎所有用途上都被认为是几乎相同的东西,但引用是强类型的、不可压缩的指针,具有内置的引用计数和析构函数调用
所以对于整数标量,您只需要提前决定如何处理它们。Perl将根据上下文高兴地从数字转换为字符串,反之亦然
#!perl6
use v6;
multi guess ( Int $a ) { say "got integer: $a" }
multi guess ( Str $a ) { say "got string: $a" }
multi guess ( Rat $a ) { say "got float: $a" }
guess(3);
guess("3");
guess(3.0);
作弊,我知道
PaulPerl没有对数字和这些数字的字符串表示进行有用的区分。你的脚本也不应该这样。您可以编写一些代码来区分看起来像整数和浮点的东西,但要知道它是否是字符串,唯一的方法是标量是否看起来不像整数或浮点 下面是一个简单的例程,它将为其参数返回
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标量时,它应该“做正确的事情”。您可能还希望添加一个检查,以查看参数是否为引用,然后以不同的方式处理该情况。您是否考虑过向函数传递一个哈希引用,其中的键指示输入的数据类型
my $str_input = { string => "100" };
my $int_input = { integer => 100 };
my $float_input = { float => 100.0 };
您可以通过检查输入的键来检查得到的类型:
my$datatype=shift(键%{$input})
并从那里获取它。(请注意,$input
发生的隐式解引用)
将
“100”
和100
视为相同的处理通常被认为是Perl的一个特性。你需要更好地解释为什么这是一个问题。当用户调用您的_函数(100)
时会发生什么?当用户调用您的_函数(“100”)
时会有什么不同。。我想不谈这件事的细节。但是由于情况需要:我从perl内部调用了一些C函数。这些函数重载并出现在我的库中。因此,我需要找出函数的类型并显式调用函数的正确版本。忽略我的[deleted]答案。我误解了问题的意图,没有意识到你说的“输入”是函数的物理参数。如果用户调用my_函数(100),函数应该调用一些C_int(100),而如果用户调用my_函数(“100”),函数应该调用,比如说C_字符串(“100”)嗯,谢谢。。所以我不应该把时间浪费在这件事上,而应该找一些其他的方法来处理它听起来很棒!!我一定会试试的。很可能,任何这样的选项或版本5中的任何其他选项??我完全不同意这一点:“你的脚本也不应该这样。”仅仅因为一种语言不做某事并不意味着做那件事总是错误的。
switch ($datatype) {
case string:
C_string($input->{$datatype});
case integer:
C_integer($input->{$datatype});
case float:
C_float($input->{$datatype});
}