2

在 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等等,这背后的逻辑是什么?

4

2 回答 2

5

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

参数“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;
}
于 2012-07-16T18:59:36.127 回答
4

引用perlop

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

$val == 9是一个数字上下文。所以它打印 A(你只是设置它),然后你得到 B 的魔法增量(它还没有在数字上下文中使用),但是你点击了==(在数字上下文中使用它),所以当你++$val又回到了 B 被视为一个数字 (0) 并递增到 1。

您可以eq用来进行字符串比较,从而保留魔法增量,但您也可以只说:

print 1 .. 8, 'A' .. 'F';
于 2012-07-16T19:00:27.083 回答