我希望确保给定值上的字符数小于1000.我的函数不确定该值是数组,散列还是标量。
if (ref($value) eq 'SCALAR' && length($value) >= 1000 ) {
return;
}
但是,如果传入号码会怎样?我是否会在不知不觉中将数字值转换为字符串,如果是这样,是否有办法在检查数字长度之前检查数值?
答案 0 :(得分:7)
在你的问题中,你是说你检查字符串中的字符数,并且包含它的变量也可以是散列引用或数组引用。
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 :(得分:1)
如果CartItems
是您声明的数字,那么$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 }
引用的标量。
(请注意,引用标量非常罕见。)