У меня есть несколько строк в моем массиве @lines
, в котором *
показывает мне время начала команды (как синхронизация/Fetch) и линию с тем же ProcessId pid
и командой без *
показывает мне время окончания , Они могут быть не всегда непрерывными. Я хотел бы получить startdate
и enddate
конкретных processID
и cmd
. Как для usera
ЦМД sync
с ProcessId 11859
началась в 2015/01/13 13:53:01.491-05:00
и закончилась в 2015/01/13 13:55:01.492-05:00
Ниже мой подход, в котором я принял хэш из массива и используется processID
как ключ и не расколоть линии. Это прекрасно работает только тогда, когда начальная и конечная строки команды непрерывны, но как я могу заставить ее работать, даже если они не являются непрерывными.Perl хэш выпуска массивов
my %users;
foreach my $line (@lines) {
if ($line =~ m{(\*)+}) {
($stdate, $sttime, $pid, $user, $cmd) = split ' ', $line;
$startdate ="$stdate $sttime";
}
else {
($eddate, $edtime, $pid, $user, $cmd) = split ' ', $line;
$enddate = "$eddate $edtime";
}
$users{$pid} = [ $startdate, $enddate, $user, $cmd ];
}
Содержание в @lines
:
2015/01/13 13:53:01.491-05:00 11859 usera *sync_cmd 7f1f9bfff700 10.101.17.111
2015/01/13 13:57:02.079-05:00 11863 userb *fetch_cmd 7f1f9bfff700 10.101.17.111
2015/01/13 13:59:02.079-05:00 11863 userb fetch_cmd 7f1f9bfff700 10.101.17.111
2015/01/13 13:55:01.492-05:00 11859 usera sync_cmd 7f1f9bfff700 10.101.17.111
@chilemagic: Не пустые строки, если в строке 1 есть дата синхронизации 'sync_cmd', конечная дата для того же идентификатора команды и процесса может быть не строка 2, она может быть в любой строке. – Jill448
Не было бы лучше сделать хэш хэшей для этого прецедента? – Sobrique