我正在寻找确保给定值上的字符数小于1000.我的函数不确定值是数组,哈希还是标量。Perl:限制字符串上的字符标量变量
if (ref($value) eq 'SCALAR' && length($value) >= 1000) {
return;
}
但是,如果传入一个数字会发生什么?我会不知不觉地将一个数值转换为一个字符串,如果有的话,有没有办法在检查数值之前检查它的长度?
我正在寻找确保给定值上的字符数小于1000.我的函数不确定值是数组,哈希还是标量。Perl:限制字符串上的字符标量变量
if (ref($value) eq 'SCALAR' && length($value) >= 1000) {
return;
}
但是,如果传入一个数字会发生什么?我会不知不觉地将一个数值转换为一个字符串,如果有的话,有没有办法在检查数值之前检查它的长度?
在你的问题,你说你检查字符串中的字符数,而包含变量它也可能是一个哈希引用或数组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
如果$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
以引用的标量。
(请注意,这是非常罕见的有一个标量的参考。)