对增量的误解

时间:2012-07-16 18:55:12

标签: perl

在Perl中,我有以下代码:

my $val = "0";

for(my $z = 0; $z <= 14; $z++)
{
    ++$val;
    if($val == 9) {
        $val = "A";
    }
    print $val;
}

打印:

1 2 3 4 5 6 7 8 A B 1 2 3 4 5

然而它应该从B到C继续,从C到D等等,这背后的逻辑是什么?

2 个答案:

答案 0 :(得分:5)

warnings会给你一个警告信息,如:

  

参数“B”在数字eq(==)

中不是数字
use warnings;
use strict;

my $val = "0";

for(my $z = 0; $z <= 14; $z++)
{
    ++$val;
    if($val eq '9') {   #   <------------------
        $val = "A";
    }
    print $val;
}

答案 1 :(得分:4)

引用perlop

  

如果增加一个数字,或在数字上下文中使用的变量的变量,则会得到正常的增量。但是,如果变量仅在字符串上下文中使用,因为它已设置,并且其值不是空字符串并且与模式/^[a-zA-Z]*[0-9]*\z/匹配,则增量将以一个字符串,保留其范围内的每个字符,带进位... (强调添加)

$val == 9是一个数字上下文。所以它打印A(你只是设置它),然后你得到B的神奇增量(它尚未在数字上下文中使用),但是你点击==(在数字中使用它)上下文),所以当你再次到达++$val时,B被视为数字(0)并递增为1。

您可以使用eq进行字符串比较,从而保留神奇的增量,但您也可以这样说:

print 1 .. 8, 'A' .. 'F';