Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中查找标量变量的数据类型_Perl - Fatal编程技术网

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

在Perl中查找标量变量的数据类型,perl,Perl,我有一个接受用户输入的函数。输入可以是整数、浮点或字符串。我有三个重载函数,应该根据输入数据的数据类型调用它们。例如,如果用户输入一个整数(比如100),则应该调用具有integer参数的函数。如果用户输入字符串(例如“100”),则应调用具有字符串参数的函数 所以我需要找出输入数据的数据类型。使用正则表达式,我能够区分整数和浮点(因为我只需要找出类型,我不喜欢使用cpan.org提供的库),但我无法找出如何区分整数和字符串。Perl将“100”和100视为相同的吗?有办法解决这个问题吗?来自p

我有一个接受用户输入的函数。输入可以是整数、浮点或字符串。我有三个重载函数,应该根据输入数据的数据类型调用它们。例如,如果用户输入一个整数(比如100),则应该调用具有integer参数的函数。如果用户输入字符串(例如“100”),则应调用具有字符串参数的函数


所以我需要找出输入数据的数据类型。使用正则表达式,我能够区分整数和浮点(因为我只需要找出类型,我不喜欢使用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);
作弊,我知道


Paul

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标量时,它应该“做正确的事情”。您可能还希望添加一个检查,以查看参数是否为引用,然后以不同的方式处理该情况。

您是否考虑过向函数传递一个哈希引用,其中的键指示输入的数据类型

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});
}