Perl6字符串强制运算符〜不喜欢前导零

时间:2016-01-10 08:29:11

标签: coercion perl6

我正在玩Rakudo Star 2015.09。

如果我尝试将前导零的整数字符串化,编译器会发出警告:

> say (~01234).WHAT
Potential difficulties:
    Leading 0 does not indicate octal in Perl 6.
    Please use 0o123 if you mean that.
    at <unknown file>:1
    ------> say (~0123<HERE>).WHAT
(Str)

我想也许我可以通过将整数值赋给变量来帮助编译器,但获得了相同的结果:

> my $x = 01234; say (~$x).WHAT
Potential difficulties:
    Leading 0 does not indicate octal in Perl 6.
    Please use 0o1234 if you mean that.
    at <unknown file>:1
    ------> my $x = 01234<HERE>; say (~$x).WHAT
(Str)

我知道这是一个愚蠢的例子,但这是设计的吗?如果是这样,为什么?

我怎样才能抑制这种警告信息?

1 个答案:

答案 0 :(得分:12)

您是否有理由拥有前导零的数据?当我有一列邮政编码时,我倾向于遇到这个问题。

当他们第一次考虑Perl 6时,其中一个目标是清理一些一致性问题。我们有0x0b(我认为到那时),但Perl 5仍然需要寻找领先的0来猜测它是八进制的。请参阅Radix Markers in Synopsis 2

但是,Perl 6还必须关注Perl 5程序员将尝试做什么以及他们期望什么。大多数人都希望领先0代表八进制。但是,它并不意味着八进制。您输入的是字面值,而不是您使用它的方式。 Perl 6有很多关于Perl 5人试图使用的事情的警告,比如foreach

$ perl6 -e 'foreach @*ARGS -> $arg { say $arg }' 1 2 3
===SORRY!=== Error while compiling -e
Unsupported use of 'foreach'; in Perl 6 please use 'for' at -e:1
------> foreach⏏ @*ARGS -> $arg { say $arg }

要取消这种警告,请不要做它警告你的事情。这种语言并不希望你这样做。如果需要字符串,请以字符串'01234'开头。或者,如果您希望它是八进制,请从0o开始。但是,要意识到对数字进行字符串化将使您返回十进制表示:

$ perl6 -e 'say ~0o1234'
668