【发布时间】:2014-10-23 03:49:52
【问题描述】:
如果我在代码流的某处有 2 个变量 $x 和 $y,我真的不知道它们是否包含数字或字符串,我该如何比较它们?
我的意思是对于字符串我们使用eq 等,而对于数字== 或<= 等
还有更多/更少等呢?
【问题讨论】:
标签: string perl numbers comparison
如果我在代码流的某处有 2 个变量 $x 和 $y,我真的不知道它们是否包含数字或字符串,我该如何比较它们?
我的意思是对于字符串我们使用eq 等,而对于数字== 或<= 等
还有更多/更少等呢?
【问题讨论】:
标签: string perl numbers comparison
如果你不知道它们是什么,你怎么能问它们是否相同?
具体来说,你认为这两者是一样的吗?
"1"
"1.0"
在数字上,它们都代表一个,但在字符串上它们包含不同的字符,所以是不同的。
【讨论】:
字符串的大/小可以用 cmp 完成。
if ( ( $a cmp $b ) == 0 ) { print "a == b\n" }
elsif ( ( $a cmp $b ) < 0 ) { print "a < b\n" }
elsif ( ( $a cmp $b ) > 0 ) { print "a > b\n" }
重申“123”以上的评论 cmp “56”将给出小于。
所以你可能想做这样的事情:
if ( compareEm($a, $b) == 0 ) { print "a == b\n" }
elsif ( compareEm($a, $b) < 0 ) { print "a < b\n" }
elsif ( compareEm($a, $b) > 0 ) { print "a > b\n" }
sub compareEm {
my ( $a, $b ) = @_;
my $isnum = qr/(?=.)(?!^\.$)^[\-\+]?\d*\.?\d*$/o;
return ( $a =~ $isnum && $b =~ $isnum ) ? $a <=> $b : $a cmp $b;
}
【讨论】:
使用eq,它将永远有效...
【讨论】:
lt、gt 等运算符会将它们作为字符串进行比较。这意味着“123”将小于“56”。
Scalar::Util 模块中你有looks_like_number,你可以用它来检查字符串是否是一个数字(或者你可以写一个正则表达式,取决于你的期望,检查一个整数很简单)。
如果您不知道您的数据是字符串还是数字,那么将它们视为字符串通常是完全安全的。如果您想将数据视为数字,那么您可能应该验证输入以确保其格式正确。
【讨论】: