Perl:限制String Scalar变量上的字符

时间:2017-01-09 12:08:10

标签: perl

我希望确保给定值上的字符数小于1000.我的函数不确定该值是数组,散列还是标量。

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

但是,如果传入号码会怎样?我是否会在不知不觉中将数字值转换为字符串,如果是这样,是否有办法在检查数字长度之前检查数值?

2 个答案:

答案 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; } 字符串化的长度,因此$valuelength(500)相同,即length("500")

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

length($value)

if (ref($ref) eq 'SCALAR' && length($$ref) >= 1000 ) { return; } $$ref的缩写)是${ $ref }引用的标量。

(请注意,引用标量非常罕见。)