将变量与perl中的前导零进行比较

时间:2016-11-02 20:50:24

标签: perl variables compiler-errors compare

我正在尝试比较$ num1和$ num2中的前7个字符。当我编译它时,我得到一个奇怪的输出。输出与$ num1或$ num2不匹配。我如何比较这两个变量?

  

输出:num1 [2739073] num2 [2739074]

$num1 = 012345601;
$num2 = 012345602;

#$num1 =~ s/^0+//;
#$num2 =~ s/^0+//;

if (substr($num1, 0, -2) == substr($num2, 0, -2)) {
    print "num1[$num1]" . " num2[$num2]\n";
} else {
    print "Not equal\n";
}

4 个答案:

答案 0 :(得分:6)

问题#1:

在Perl中,您将字符串与eq运算符进行比较,而不是==

正确的比较是:

if ( substr($num1, 0, 7) eq substr($num2, 0, 7) ) {
    # ...
}
else {
    # ...
}

问题#2:

以0开头的数字被解释为 octal ,你可以在perldoc perlnumber

中阅读更多相关内容
12345601 (octal) == 2739073 (decimal)
12345602 (octal) == 2739074 (decimal)

问题#3:

缺少use strict;use warnings;

答案 1 :(得分:2)

如上所述,问题在于

my $num1 = 012345601;  # Assigns 2739073 (octal 012345601)
my $num2 = 012345602;  # Assigns 2739074 (octal 012345601)

应该是

my $num1 = '012345601';
my $num2 = '012345602';

比较除最后两位数之外的所有数字的简单方法是

int($num1/100) == int($num2/100)

答案 2 :(得分:1)

如果你用零开始你的数字,那么Perl将它们解释为八进制数字(基于8),而不是基于10的“常规”数字。

答案 3 :(得分:1)

看起来您希望将数字视为字符串,因此:

$num1 = "012345601";
$num2 = "012345602";

...

并且至少要使用eq而不是==,直到你想再次将字符串视为数字。