在Perl中自动增量字母

Bri*_*ian 12 perl auto-increment

我不明白Perl中的自动增量字母.

这个例子似乎完全可以理解:

$a = 'bz'; ++$a;
ca #output
Run Code Online (Sandbox Code Playgroud)

b增加到c.没有什么z可去的,所以它可以追溯到a(或至少这是我看到的过程).

但后来我遇到这样的陈述:

$a = 'Zz'; ++$a;
AAa #output
Run Code Online (Sandbox Code Playgroud)

和:

$a = '9z'; ++$a;
10 #output
Run Code Online (Sandbox Code Playgroud)

为什么不增加Zz收益Aa?为什么不增加9z回报0z呢?

谢谢!

cjm*_*cjm 23

引用perlop:

但是,如果变量仅在字符串上下文中使用,因为它已设置,并且其值不是空字符串并且与模式匹配/^[a-zA-Z]*[0-9]*\z/,则增量以字符串形式完成,保留其范围内的每个字符,带进位.

范围是0-9,AZ和az.当需要新角色时,它取自第一个角色的范围.每个范围都是独立的; 角色永远不会离开他们开始的范围.

9z与模式不匹配,因此它获得数字增量.(它可能应该给出"参数不是数字"警告,但它不在Perl 5.10.1中.)只有所有字母(如果有的话)之后才允许数字,从不在它们之前.

需要注意的是全数字的字符串匹配的模式,并且确实收到一个字符串增量(如果它从未在数字环境中使用).但是,此类字符串上的字符串增量结果与数字增量相同,只是它具有无限精度并保留前导零(如果有).(因此,当数字位数超过IV或NV可以存储的位数或者它具有前导零时,您只能区分.)

我不明白为什么你认为Zz应该成为Aa(除非你考虑模块化算术,但事实并非如此).它AAa通过这个过程:

  1. 增加z包裹到a.增加前一个字符.
  2. 增加Z包裹到A.之前没有字符,因此请添加此范围中的第一个字符,这是另一个字符A.

范围操作符(..),给出当两个字符串(和左手一个模式匹配),使用字符串增量以产生列表(这是接近该部分的端部解释).该列表以左侧操作数开始,然后递增,直到:

  1. 该值等于右侧操作数,或
  2. 值的长度超过右侧操作数的长度.

它返回所有值的列表.(如果案例2终止了列表,则最终值不包含在其中.)

  • @Brian,这不是一种模式.它从左侧操作数开始.它递增直到它等于右手操作数,并返回所有值的列表.字母循环通过AZ,数字通过0-9. (2认同)

hob*_*bbs 6

  1. 因为(暂时忽略案例;案件只是保留,没有任何有趣的事情发生),'AA'是'Z'的继承者,那么它怎么也可能成为'ZZ'的继承者?'ZZ'的继任者是'AAA'.

  2. 因为就++所有其他数字运算符而言,"9z"只是编写9的愚蠢方式,而9的后继是10.自动增量的特殊字符串行为明确指定仅出现在字母串或字符串上字母后跟数字(不以任何其他方式混合).