确保带前导零的字符串的十进制解释的最佳方法?
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 不匹配 11
到 011
在上面的简单情况下,您可能会想,嘿,不管怎样,让我们使用散列键中的前导零进行算术运算:
$ 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
原代码的问题是哈希键是字符串,011
和11
是不同的字符串
解决方案 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
。
这支持任意数量的前导零。
我有一些带前导零的简单数据,我想插入一些附加值。像这样:
$ 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 不匹配 11
到 011
在上面的简单情况下,您可能会想,嘿,不管怎样,让我们使用散列键中的前导零进行算术运算:
$ 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
原代码的问题是哈希键是字符串,011
和11
是不同的字符串
解决方案 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
。
这支持任意数量的前导零。