Регулярное выражение Perl.. соответствует словам ровно 2 разаВвод представляет собой файл JSON

Я новичок в любом регулярном выражении. Мне нужна ваша помощь / указатели в решении проблемы. У меня есть файл JSON, который выглядит следующим образом.

формат JSON

{"record-type":"int-stats","time":1389309548046925,"host-id":"a.b.c.d","port":"ab-0/0/44","latency":108992}
{"record-type":"int-stats","time":1389309548046925,"host-id":"x.x.x.x","port":"ab-0/0/45","latency":36940}
{"record-type":"int-stats","time":1389309548046925,"host-id":"x.x.x.x","port":"ab-0/0/46","latency":11315}
{"record-type":"int-stats","time":1389309548046925,"host-id":"x.x.x.x","port":"ab-0/0/47","latency":102668}
{"record-type":"int-stats","time":1389309548046925,"host-id":"x.x.x.x","port":"ab-0/0/9","latency":347776}

{"record-type":"int-stats","time":1389309548041555,"host-id":"a.b.c.d","port":"ab-0/0/44","latency":108992}
{"record-type":"int-stats","time":1389309548041554,"host-id":"x.x.x.x","port":"ab-0/0/45","latency":36940}
{"record-type":"int-stats","time":1389309548046151,"host-id":"x.x.x.x","port":"ab-0/0/46","latency":11315}
{"record-type":"int-stats","time":1389309548041667,"host-id":"x.x.x.x","port":"ab-0/0/47","latency":102668}
{"record-type":"int-stats","time":1389309548042626,"host-id":"x.x.x.x","port":"ab-0/0/9","latency":347776}

{"record-type":"int-stats","time":1389309548035666,"host-id":"a.b.c.d","port":"ab-0/0/44","latency":108992}
{"record-type":"int-stats","time":1389309548035635,"host-id":"x.x.x.x","port":"ab-0/0/45","latency":36940}
{"record-type":"int-stats","time":1389309548042255,"host-id":"x.x.x.x","port":"ab-0/0/46","latency":11315}
{"record-type":"int-stats","time":1389309548041715,"host-id":"x.x.x.x","port":"ab-0/0/47","latency":102668}
{"record-type":"int-stats","time":1389309548046161,"host-id":"x.x.x.x","port":"ab-0/0/9","latency":347776}

{"record-type":"int-stats","time":1389309548023422,"host-id":"a.b.c.d","port":"ab-0/0/44","latency":108992}
{"record-type":"int-stats","time":1389309548041617,"host-id":"x.x.x.x","port":"ab-0/0/45","latency":36940}
{"record-type":"int-stats","time":1389309548046676,"host-id":"x.x.x.x","port":"ab-0/0/46","latency":11315}
{"record-type":"int-stats","time":1389309548045675,"host-id":"x.x.x.x","port":"ab-0/0/47","latency":102668}
{"record-type":"int-stats","time":1389309548046172,"host-id":"x.x.x.x","port":"ab-0/0/9","latency":347776}

{"record-type":"int-stats","time":1389309548034534,"host-id":"a.b.c.d","port":"ab-0/0/44","latency":108992}
{"record-type":"int-stats","time":1389309548012345,"host-id":"x.x.x.x","port":"ab-0/0/45","latency":36940}
{"record-type":"int-stats","time":1389309548025232,"host-id":"x.x.x.x","port":"ab-0/0/46","latency":11315}
{"record-type":"int-stats","time":1389309548023423,"host-id":"x.x.x.x","port":"ab-0/0/47","latency":102668}
{"record-type":"int-stats","time":1389309548252352,"host-id":"x.x.x.x","port":"ab-0/0/9","latency":347776}

Мне нужно извлечь "port":"ab-0/0/44" и связать "time" с этим портом. Я пытаюсь рассчитать разницу во времени для любых двух таких случаев, т.е. 1-й случай -> "time":1389309548046925 "port":"ab-0/0/44" 2-й случай -> "time":1389309548041555 "port":"ab-0/0/44". Вычисленная разница во времени должна быть сохранена в переменной. Я пробовал использовать такое регулярное выражение /\"time\":\\d+\.*\"port\":\".b-0\/0\/44\"/. Любая помощь приветствуется. Заранее спасибо!


person spamulap12    schedule 19.02.2014    source источник
comment
Не используйте регулярное выражение для разбора JSON, используйте модуль JSON. Какой код у вас есть до сих пор?   -  person Nate    schedule 20.02.2014


Ответы (1)


Используйте модуль JSON. Это довольно просто.

use strict;
use warnings;
use JSON;

while (<>) {
    /\S/ or next;
    my $data = decode_json($_);
    print "port -> $data->{port}\n";
    print "time -> $data->{time}\n";
}

С вашими данными я получаю вывод следующим образом:

port -> ab-0/0/44
time -> 1389309548046925
port -> ab-0/0/45
time -> 1389309548046925
... etc

Я не уверен, как вы хотите рассчитать свое время, но я предполагаю, что выполнение арифметических действий — это то, что вы можете лучше всего понять самостоятельно.

person TLP    schedule 19.02.2014
comment
Привет .. большое спасибо за ваш указатель. Я также очень новичок в perl. Извините, если я не ясен в своем вопросе. Но мне нужны только порты со значением ab-0/0/44 и их соответствующее время. У меня есть эти данные JSON, повторяющиеся с одним и тем же портом, но с разными отметками времени несколько тысяч раз, и я ищу ровно два таких случая. Не более того. Заранее спасибо! - person spamulap12; 20.02.2014
comment
Я показал вам, как анализировать данные JSON. Вы хотите сказать, что недостаточно хорошо понимаете Perl, чтобы использовать проанализированные данные, чтобы делать то, что вы хотите? - person TLP; 20.02.2014
comment
Ага. Я пока плохо понимаю Perl. Но очень скоро буду :) Как хранить в массиве? Я ценю ваше время и усилия - person spamulap12; 20.02.2014
comment
Возможно, вам следует взглянуть на perldoc perlfunc. Там вы найдете функции, связанные с массивами. Вам также может понравиться perldoc perlop, где вы можете найти операторы для сравнения строк (eq и т. д.). - person TLP; 20.02.2014
comment
Большое спасибо! Я понял. Все ваши предложения полезны. - person spamulap12; 20.02.2014