在 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等等,这背后的逻辑是什么?
在 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等等,这背后的逻辑是什么?
警告会给你一个警告信息,比如:
参数“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;
}
引用perlop:
如果你增加一个数字变量,或者曾经在数字上下文中使用过的变量,你会得到一个正常的增量。但是,如果该变量自设置以来仅在字符串上下文中使用,并且其值不是空字符串且与模式匹配
/^[a-zA-Z]*[0-9]*\z/
,则增量作为字符串完成,将每个字符保留在其范围内,并带有进位... (强调)
$val == 9
是一个数字上下文。所以它打印 A(你只是设置它),然后你得到 B 的魔法增量(它还没有在数字上下文中使用),但是你点击了==
(在数字上下文中使用它),所以当你++$val
又回到了 B 被视为一个数字 (0) 并递增到 1。
您可以eq
用来进行字符串比较,从而保留魔法增量,但您也可以只说:
print 1 .. 8, 'A' .. 'F';