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

Posted

技术标签:

【中文标题】Perl6 字符串强制运算符 ~ 不喜欢前导零【英文标题】:Perl6 string coercion operator ~ doesn't like leading zeros 【发布时间】:2016-04-14 16:45:04 【问题描述】:

我在玩 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)

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

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

【问题讨论】:

我会说答案是“不要使用模棱两可的文字”。 @IgnacioVazquez-Abrams : &gt; my $x = sprintf "%05d", 1234; say (~$x).WHAT 不会发出警告 那是因为"%05d"1234 都是明确的。 @IgnacioVazquez-Abrams :我认为你正在做某事......my $x = sprintf "%05d", 01234;... 导致警告 也可以通过使用像IntStr 这样的同构值来保留数字的字符串表示,例如通过val("01234")&lt; 01234 &gt; 【参考方案1】:

您有前导零的数据是否有原因?当我有一列邮政编码时,我往往会遇到这个问题。

当他们第一次考虑 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

【讨论】:

最后一个问题呢。可以抑制警告吗? 我不得不做perl -E 'say 01234' 才能弄清楚这是 Perl 5 的遗产......你每天都在学习的东西 :) 还值得指出的是,前导“0”表示八进制(或前导“0x”表示十六进制)仅适用于程序源代码中的文字值。从文件中读取的数据的前导零不会对值的解释方式产生任何影响 - 数字将始终被视为十进制。 @ikegami: quietly  …   禁止警告。

以上是关于Perl6 字符串强制运算符 ~ 不喜欢前导零的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl 6 自定义运算符

第九十四章 SQL函数 %MINUS

位运算————数字转换为十六进制

使用c#导入excel文档时如何防止前导零被剥离

Bigrquery 强制将字符串强制转换为整数(模式是字符串)

python数据类型强制转换和运算符