【问题标题】:Increment (++) and decrement (--) strings in PerlPerl 中的递增 (++) 和递减 (--) 字符串
【发布时间】:2011-06-23 17:20:59
【问题描述】:

使用perl -e '$string="a";print ++$string;',我们得到b
但是使用perl -e '$string="b";print --$string;' 我们得到-1

那么,如果我们可以增加,为什么我们不能减少呢?

已编辑
perlop的“自动减量运算符并不神奇”

Perl 为我们提供了很多功能,为什么不提供这个呢?这不是批评,但对于类似的运营商来说,不会有类似的行为吗?有什么特殊原因吗?

【问题讨论】:

  • 我认为你的内引号需要是双引号。
  • 是的,在文档中,增量是神奇的,而不是减量(参见 man perlop,搜索自动增量)

标签: perl


【解决方案1】:

perlop(1) 解释说这是真的,但没有给出理由:

自增运算符有一点额外的内置魔法。 [如果适用,并且受到某些限制,]增量作为字符串完成,将每个字符保留在其范围内,带有进位[...]

自减运算符并不神奇。

你得到 -1 的原因是因为当解释为数字时,“b”变成 0,因为它没有前导数字(相反,“4b”变成 4)。

【讨论】:

    【解决方案2】:

    至少有三个原因:

    1. 因为没有太大的需要
    2. 自增的魔力被认为是错误的,没有理由以同样错误的方式实现自动递减
    3. 无法修复自动递增的魔力,因为 p5p 不喜欢破坏向后兼容性

    另一方面,Raku(née Perl 6)不需要向后兼容,因此对于自动递增字符串具有更好的行为,并且还具有自动递减功能。 ++ 和 -- 运算符通过在它们正在操作的对象上调用 succpred 方法来工作。

    【讨论】:

    • 链接现在已损坏。你能解决它吗?
    • @EugenKonkov 更新了语言名称并将链接更改为指向当前文档。
    【解决方案3】:

    Perl 为我们提供了很多功能,为什么不选择这个呢?

    因为在范围内的“最低”字符之前应该有哪些值并不直观。 "A" + 1 应该是 "B""B" + 1 应该是 "C" 可能是有意义的。因此"B" - 1 应该是"A"。但是"A" - 1 应该是什么?

    【讨论】:

    • 为什么不遵循 ASCII 表?
    • @TLP:因为那不会跟随++ 的领导。如果你使用perl -e '$str="z"; print ++$str',你会得到aa,它肯定不会跟在ASCII 表中的z 之后。
    • "A"-1 不明确,但可以定义为 -1 或任何其他智能解决方案。其他都有逻辑结果!
    • 可能"A" - 1 = undef 或零
    猜你喜欢
    • 2012-04-29
    • 2011-02-16
    • 2015-10-03
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多