【发布时间】:2017-07-27 03:27:24
【问题描述】:
我看到以下日志消息。通过查看数字,我怀疑timeStampLastSeekPoint 总是一加timeInNanos。
% grep -E '^java.lang.IllegalArgumentException.*timeStampLastSeekPoint' messages | head -5
java.lang.IllegalArgumentException: timeInNanos=1500629929661000010, timeStampLastSeekPoint=1500629929661000011
java.lang.IllegalArgumentException: timeInNanos=1500629929661000010, timeStampLastSeekPoint=1500629929661000011
java.lang.IllegalArgumentException: timeInNanos=1500629929661000010, timeStampLastSeekPoint=1500629929661000011
java.lang.IllegalArgumentException: timeInNanos=1500630763150000010, timeStampLastSeekPoint=1500630763150000011
java.lang.IllegalArgumentException: timeInNanos=1500630763150000010, timeStampLastSeekPoint=1500630763150000011
为了证实我的怀疑,我通过管道输入这个 perl 单行代码以提取数字并显示差异。差异显示全 0,这不可能。很明显,我需要更高的精度。
% grep -E '^java.lang.IllegalArgumentException.*timeStampLastSeekPoint' messages | \
perl -ne 'if (/timeInNanos=(\d+), timeStampLastSeekPoint=(\d+)/) { printf("%ld %ld %ld\n", $1, $2, $2 - $1) }' | head -5
1500629929661000010 1500629929661000011 0
1500629929661000010 1500629929661000011 0
1500629929661000010 1500629929661000011 0
1500630763150000010 1500630763150000011 0
1500630763150000010 1500630763150000011 0
我用谷歌搜索,找到了bigint 模块,并尝试了它。但是还是不行。
% grep -E '^java.lang.IllegalArgumentException.*timeStampLastSeekPoint' messages | \
perl -Mbigint -ne 'if (/timeInNanos=(\d+), timeStampLastSeekPoint=(\d+)/) { printf("%ld %ld %ld\n", $1, $2, $2 - $1) }' | head -5
1500629929661000010 1500629929661000011 0
1500629929661000010 1500629929661000011 0
1500629929661000010 1500629929661000011 0
1500630763150000010 1500630763150000011 0
1500630763150000010 1500630763150000011 0
经过几次尝试,我发现它只有在将正则表达式匹配分配给常规变量后才有效。顺便说一句,我现在确认我的怀疑,即差异始终为 1。
% grep -E '^java.lang.IllegalArgumentException.*timeStampLastSeekPoint' messages | \
perl -Mbigint -ne 'if (/timeInNanos=(\d+), timeStampLastSeekPoint=(\d+)/) { printf("%ld %ld %ld\n", $1, $2, ($b=$2) - ($a=$1)) }' | head -5
1500629929661000010 1500629929661000011 1
1500629929661000010 1500629929661000011 1
1500629929661000010 1500629929661000011 1
1500630763150000010 1500630763150000011 1
1500630763150000010 1500630763150000011 1
现在我找到了解决方法,一切都很好。但是,为什么需要分配并不直观。 $2 - $1 不应该工作吗?感觉是个bug。或者,是否有解释可以理解这是一种合理的行为? perl 版本为 v5.14.2。
【问题讨论】:
-
顺便说一句,“
%ld”中的“l”在 Perl 中毫无意义。
标签: perl