确保以零开头的字符串进行十进制解释的最佳方法?

ste*_*iva 1 perl octal radix leading-zero

我有一些带有前导零的简单数据,并且我想插入一些其他值。像这样:

$ printf "C011=4\nC015=8\n" | perl -ne '/C(\d\d\d)=(.*)/; $l{$1}=$2 }{ $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
Run Code Online (Sandbox Code Playgroud)

好的。Perl的不匹配11,以011

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

$ printf "C011=4\nC015=8\n" | perl -ne '/C(\d\d\d)=(.*)/; $l{$1}=$2 }{ $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
Run Code Online (Sandbox Code Playgroud)

在这里,我显然将字符串011(printf变为11)和八进制数字013(其printf变为11)作为关键字。并且011and 015值的查找仍然失败。

在perl中,有哪些选择可以避免将前导零(而不是9)解释为八进制的数字的行为?我希望哈希键具有其适当的十进制值。

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

预期产量:

C011=4.000000
C013=6.000000
C015=8.000000
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 6

原始代码的问题在于,哈希键是字符串,011并且11是不同的字符串。


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

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

包含起来更简单C

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

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

替换$l{$1}=$2$l{0+$1}=$2

这将等于01111,然后将其字符串化为11

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

  • 在Perl中,标量被强制转换为期望数字的数字(加,乘,`sprintf%d等),并在期望字符串转换为字符串(“ print”,哈希键等)。sprintf%d是可以的,但是0+便宜并且可以自我记录(因为没有人会用0+来做其他事情)。 (3认同)