在Perl中查找标量变量的数据类型

时间:2011-06-15 17:23:39

标签: perl

我有一个接受用户输入的功能。输入可以是整数,浮点数或字符串。我有三个重载函数,应根据输入数据的DATA TYPE调用。例如,如果用户输入整数(例如100),则应调用具有整数参数的函数。如果用户输入字符串(例如“100”),则应调用具有字符串参数的函数。

所以我需要找出输入数据的数据类型。使用正则表达式,我能够区分整数和浮点数(因为我只需要找出类型,我不喜欢使用cpan.org提供的库),但我无法弄清楚如何区分字符串中的整数。 Perl对待“100”和100对待?有没有办法解决这个问题?

4 个答案:

答案 0 :(得分:11)

来自perldoc perldata

  

标量不一定是一回事。没有地方可以将标量变量声明为“string”类型,键入“number”,键入“reference”或其他任何内容。由于标量的自动转换,返回标量的操作无需关心(事实上,无关心)其调用者是否正在查找字符串,数字或引用。 Perl是一种上下文多态语言,其标量可以是字符串,数字或引用(包括对象)。虽然字符串和数字几乎可以用于几乎所有目的,但是引用是强类型的,带有内置引用计数和析构函数调用的uncastable指针。

因此,对于整数标量,您只需要提前决定如何处理它们。根据上下文,Perl会愉快地从数字转换为字符串,反之亦然。

答案 1 :(得分:9)

Perl没有对这些数字的数字和字符串表示进行有用的区分。您的脚本也不应该。您可以编写一些代码来区分看起来像整数和浮点数的东西,但是知道它是否是字符串的唯一方法是标量看起来不是整数还是浮点数。

这是一个简单的例程,它会为其参数返回intratstr。请注意,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标量时,哪个应该“做正确的事”。您可能还想添加一个检查以查看参数是否为引用,然后以不同方式处理该情况。

答案 2 :(得分:2)

#!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);

作弊,我知道......

答案 3 :(得分:1)

您是否考虑过将函数传递给哈希引用,其中的键指示输入的数据类型是什么?

my $str_input = { string => "100" };
my $int_input = { integer => 100 };
my $float_input = { float => 100.0 };

您可以通过检查输入的键来检查您获得的类型: my $datatype = shift (keys %{$input})并从那里拿走它。 (注意发生在[{1}})

的隐式解除引用
$input