确保带前导零的字符串的十进制解释的最佳方法?

Best way to ensure decimal interpretation of string with leading zeros?

我有一些带前导零的简单数据,我想插入一些附加值。像这样:

$ printf "C011=4\nC015=8\n" | perl -ne '/C(\d\d\d)=(.*)/; $l{}= }{ $l{13}=($l{15}-$l{11})/2+$l{11}; printf "C%03d=%f\n",$_,$l{$_} for keys %l;'

C011=4.000000
C013=0.000000
C015=8.000000

好的。 Perl 不匹配 11011

在上面的简单情况下,您可能会想,嘿,不管怎样,让我们​​使用散列键中的前导零进行算术运算:

$ printf "C011=4\nC015=8\n" | perl -ne '/C(\d\d\d)=(.*)/; $l{}= }{ $l{013}=($l{015}-$l{011})/2+$l{011}; printf "C%03d=%f\n",$_,$l{$_} for keys %l;'

C011=4.000000
C011=0.000000
C015=8.000000

这里我显然有字符串 011 作为键,printf 变成 11,八进制数 013,printf 变成 11。以及 011 和 [=19 的查找=] 值 仍然 失败。

perl 中有哪些选项可以避免将带有前导零(并且没有 9)的数字解释为八进制?我希望散列键具有适当的十进制值。

我有一个解决方法。我只是想看看它是否是最简洁的解决方案。类似于全局不要这样做,我从不使用八进制。

预期输出:

C011=4.000000
C013=6.000000
C015=8.000000

原代码的问题是哈希键是字符串,01111是不同的字符串


解决方案 1:使用正确的字符串。

perl -ne'
   /C(\d\d\d)=(.*)/; $l{}=;
   END {
      $l{"013"}=($l{"015"}-$l{"011"})/2+$l{"011"};
      printf "C%s=%f\n",$_,$l{$_} for sort keys %l;
   }
'

包含 C 更简单。

perl -ne'
   /(C\d\d\d)=(.*)/; $l{}=;
   END {
      $l{C013}=($l{C015}-$l{C011})/2+$l{C011};
      printf "%s=%f\n",$_,$l{$_} for sort keys %l;'
   }
'

解决方案 2:转换捕获的字符串以匹配代码生成的字符串。

$l{}=替换为$l{0+}=

这会将 011 数字化为 11,然后将其字符串化为 11

这支持任意数量的前导零。