Perl 如何从十六进制时间获得纳秒级粒度?
我正在尝试将十六进制时间(从内核模块获取第一个输出)转换为纳秒粒度Perl 如何从十六进制时间获得纳秒级粒度?,perl,hex,Perl,Hex,我正在尝试将十六进制时间(从内核模块获取第一个输出)转换为纳秒粒度 580a9272.0a9ce167 我正在尝试使用perl将其转换为人类可读的格式: while (<>) { s/^([a-fA-F0-9]+)(\.)([a-fA-F0-9]+)(\s+.*)/sprintf("%s%s%s%s",&$converter(hex($1)), $2, hex($3), $4)/oe; } continue { print; } while(){ s/^([a-fA-F
580a9272.0a9ce167
我正在尝试使用perl将其转换为人类可读的格式:
while (<>) {
s/^([a-fA-F0-9]+)(\.)([a-fA-F0-9]+)(\s+.*)/sprintf("%s%s%s%s",&$converter(hex($1)), $2, hex($3), $4)/oe;
} continue {
print;
}
while(){
s/^([a-fA-F0-9]+)(\)([a-fA-F0-9]+)(\s+.*)/sprintf(“%s%s%s%s”、&$converter(十六进制($1))、$2、十六进制($3)、$4)/oe;
}继续{
印刷品;
}
输出:星期五10月21日18:10:58 2016.178053479
转换器直接使用localtime()和gmtime()
我希望时间是纳米级的,然后是一年。非常感谢您的帮助。POSIX::strftime不支持分数秒,因此您需要部分构建输出
use POSIX qw( strftime );
my $opt_gmt = 1;
my $hex = '580a9272.0a9ce167';
my ($s, $ns) = map hex($_), split /\./, $hex;
my $formatted_ns = sprintf("%09d", $ns);
my $formatted = strftime("%a %b %d %H:%M:%S.$formatted_ns %Y",
defined($opt_gmt) ? gmtime($s) : localtime($s));
say $formatted; # Fri Oct 21 22:10:58.178053479 2016
DateTime本机支持纳秒,因此提供了另一种选择
use DateTime qw( );
my $opt_gmt = 1;
my $hex = '580a9272.0a9ce167';
my ($s, $ns) = map hex($_), split /\./, $hex;
my $dt = DateTime->from_epoch( epoch => $s );
$dt->set_nanosecond( $ns );
$dt->set_time_zone( defined($opt_gmt) ? 'UTC' : 'local' );
say $dt->strftime("%a %b %d %H:%M:%S.%N %Y"); # Fri Oct 21 22:10:58.178053479 2016
这有帮助吗?该链接讲述了在C++中做这件事,我用Perl来转换,我非常接近,但是最后一个比特丢失了。我正在使用:如果(定义($optjgMT)){μgMT总是赢。$转换器=\yMyGMimTime};ELSIF(定义($optjOnLead)){Lo.LoalTalk请求。$Currase\\MyLoLoTaltTime};否则{#默认值为localtime。$converter=\&my\u localtime;}相应地进行了调整。
$opt\u gmt=0;
导致使用UTC,这真的很奇怪。只是跟进一下,不使用任何其他模块就可以完成吗?但是核心?是的,请参阅我答案的前半部分。它只使用核心Perl。