2017-01-09 57 views
0

我正在寻找确保给定值上的字符数小于1000.我的函数不确定值是数组,哈希还是标量。Perl:限制字符串上的字符标量变量

if (ref($value) eq 'SCALAR' && length($value) >= 1000) { 
    return; 
} 

但是,如果传入一个数字会发生什么?我会不知不觉地将一个数值转换为一个字符串,如果有的话,有没有办法在检查数值之前检查它的长度?

回答

7

在你的问题,你说你检查字符串中的字符数,而包含变量它也可能是一个哈希引用或数组ref。

if (ref($value) eq 'SCALAR' && length($value) >= 1000) { 
    return; 
} 

但是,你的代码不检查字符串或数字的长度。它假设该变量可能是标量引用,但会检查标量引用的字符串化的长度。

say \"asdf"; 
# SCALAR(0x268e7f8) 

say length \"asdf"; 
# 17 

在64位系统上该长度应始终为17,或在32位系统上应为16。


一旦您实际取消引用您的标量引用,将应用以下内容。

#          here and here 
#          ##  # 
if (ref($value) eq 'SCALAR' && length(${ $value }) >= 1000) { 
    return; 
} 

由于Perl没有类型,数字将被视为字符串。通过"500"与通过500相同。

say length 500; 
say length "500"; 

__END__ 
3 
3 

本身不会可变转换。你根本不需要关心。你的代码很好,只要你在标量引用中包含数字。

标量引用不关心它是否引用一个字符串或数字。

say length ${ \500 }; 
say length ${ \"500" }; 

__END__ 
3 
3 
1

如果$value是您声明的数字,那么ref将返回一个空字符串,因此执行将继续执行到下一个语句。你只是想

if (!ref($value) && length($value) >= 1000) { 
    return; 
} 

这将采取$value的字串长度,所以length(500)是一样的length("500"),这是3


如果$value是对数字的引用,那么您的代码也是错误的。 length($value)将采用引用的字符串化的长度。你想

if (ref($ref) eq 'SCALAR' && length($$ref) >= 1000) { 
    return; 
} 

$$ref(简称${ $ref })是$ref以引用的标量。

(请注意,这是非常罕见的有一个标量的参考。)