什么是Perl相当于Python的type()函数

时间:2011-03-03 12:34:04

标签: python perl

我可以用Python做到这一点:

>>> type(1)
<class 'int'>

什么是Perl等价物?

5 个答案:

答案 0 :(得分:9)

Perl并没有像Python或Ruby那样区分字符串和数字。在Perl中,运算符的使用决定了变量的解释方式。

在Python中,当您编写1 + 2时,Python会检查每个参数的类型,看到它们是数字,然后执行添加(3)。如果您编写'1' + '2',它会看到两者都是字符串,并执行连接('12')。如果你写1 + '2',你会收到类型错误。

在Perl中,当您编写1 + 2时,+运算符会在其参数上强加数字上下文。每个参数都转换为一个数字(如果参数无法干净地转换,则会发出后续警告),然后执行添加(3)。如果您编写'1' + '2',则参数仍会转换为结果为3的数字。

如果你想要连接,你可以使用.运算符:1 . 2,这将导致'12',即使这两个参数都是数字。

因此,由于Perl的运算符强制进行类型解释,因此变量本身不需要(也不会)包含类型。如果您确实需要确定哪个是哪个,则可以使用Scalar::Util的{​​{1}}函数,但通常在Perl中进行编码表示存在设计问题。

Perl的标量变量可以包含以下四种内容之一:

  • 字符串
  • 未定义的值(looks_like_number
  • 引用(可以是对任何基元类型或对象的引用)

undef关键字用于确定标量是否包含引用,以及该引用的类型。

ref

完整列表可在perldoc -f ref

找到

当引用ref(1) --> '' (a false value) ref('string') --> '' (a false value) ref([1, 2, 3]) --> 'ARRAY' ref({a => 1}) --> 'HASH' ref(\1) --> 'SCALAR' ref(\\1) --> 'REF' ref(sub {}) --> 'CODE' 加入包时,该引用将成为对象。在这种情况下,bless将返回对象被祝福的包的名称。

ref

答案 1 :(得分:6)

尝试ref

答案 2 :(得分:4)

我不确定为什么没有_INTEGER功能。

如果您正在处理对象,那么Scalar::Util::blessed是现代检查方式。它执行ref所做的事情,但不返回未经过引用的引用的值。 (这是Perl中 的对象。)


Perl和TIMTOWTDI(YMMV)的美妙之处在于,您可以通过组合嗅探方法使其成为您想要的。将其粘贴在模块中并重复使用。

答案 3 :(得分:3)

您可以使用'isa'来测试目标是否属于特定类(但您必须询问它是否属于它)。 'ref'可用于查找引用的数据类型,或者它是否完全不是引用。

AFAIK,没有真正的等价物,因为在Perl中键入并不像在Python中那样。

答案 4 :(得分:1)

如果您想检查某些内容是否为整数,可以尝试以下操作:

use Scalar::Util;

if ( defined $value
  && !ref $value 
  && ref \$value eq 'SCALAR' 
  && Scalar::Util::looks_like_number($value)
  && $value =~ /^-?[0-9]+$/msx
) {
    printf '%s is an integer', $value;
}