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)
原始代码的问题在于,哈希键是字符串,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。
这支持任意数量的前导零。