2015-06-09 75 views
-2

我有一個具有一些行這樣一個文件:定義中擊或Perl的變量與正則表達式

{"v":0,"_id":"54ff561168a","time":"1421165205"}

欲使用bash讀取每一行,並設置的時間值Variable(t)並用其他時間戳代替date -d @{$t}

您知道如何使用正則表達式獲取時間值作爲變量?

+5

使用JSON解析器。 – Biffen

回答

4

那就是JSON。您可以在Perl解析JSON像這樣:

#!/usr/bin/perl 
use strict; 
use warnings; 
use JSON; 
use Data::Dumper; 

my $text = '{"v":0,"_id":"54ff561168a","time":"1421165205"}'; 

my $data = decode_json ($text); 
print Dumper $data; 

print $data -> {"time"},"\n"; 

$data -> {"time"} = time(); 

$text = encode_json($data); 

print "Result:\n"; 
print $text; 

你不需要正則表達式 - 而事實上,你應該主動迴避他們,因爲JSON允許你格式化與例如數據換行/縮進 - 在語義上是相同的。

例如你可以輸出上面的例子:

{ 
    "_id" : "54ff561168a", 
    "time" : 1433859139, 
    "v" : 0 
} 

使用:

$text = to_json($data, {pretty => 1}); 

這意味着同樣的事情,但不同的正則表達式適用得益於改變空格等

如果您希望操作/重新格式化您的時間戳,我會將您推薦給優秀的Time::Piece模塊:

use Time::Piece; 
my $t = localtime ($data -> {"time"}); 
print $t; 

會給:

Tue Jan 13 16:06:45 2015 

如果你想有一個特定的格式:

print $t->strftime("%Y/%m/%d %H:%M:%S"),"\n"; 

,並提供:

2015/01/13 16:06:45