Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何从十六进制时间获得纳秒级粒度?_Perl_Hex - Fatal编程技术网

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。