我可以用Python做到这一点:
>>> type(1)
<class 'int'>
什么是Perl等价物?
答案 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)
Params::Util::_POSINT
是检查标量是否为正整数的一种很好的标准方法。Params::Util::_NONNEGINT
是检查标量是正整数还是0的好方法。我不确定为什么没有_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;
}