use 5.022; use warnings; open my $logFH, q{<}, \ <<__EOD__ or die $!; Message: 11 started at: 2018-06-29 16:20:07 Transmit: ATV1[0D] Transmit: [01]10179311000=[03] Receive: [01]20179321157>[02]0000006880140000000000000000000000000000000000688014000000 000000006880140000000000000000000040000000004000000000400000000040000000000000 000000000000000000[03][00] Transmit: [01]10179312000>[03] Receive: [01]20179331157?[02]0000006880140000000000000000000000000000000000688014000000 000000006880140000000000000000000040000000004000000000400000000040000000000000 000000000000000000[03][00] Transmit: [01]10179313000?[03] Receive: [01]201793411578[02]0000006880140000000000000000000000000000000000688014000000 000000006880140000000000000000000040000000004000000000400000000040000000000000 000000000000000000[03][00] Transmit: [01]101793140008[03] Receive: [01]201793511579[02]0000006880140000000000000000000000000000000000688014000000 000000006880140000000000000000000040000000004000000000400000000040000000000000 000000000000000000[03][00] Transmit: [01]101793150009[03] Receive: [01]001793611578[02]0000006880140000000000000000000000000000000000688014000000 000000006880140000000000000000000040000000004000000000400000000040000000000000 000000000000000000[03][00] Message: reading of spontaneous buffer not ordered Message: Periodic Buffer: Start: 2018-06-29 13:15:00 End: 2018-06-29 16:10:00 Periods: 36 Dec: 8 Points: 15 bytes collected: 5564 estimated: 5564 Message: amount of bytes collected ok, data accepted Message: 11 ended at: 2018-06-29 16:20:46 __EOD__ my @records = do { local $/ = q{}; map { join q{ }, map { m{\[\d\d\]} ? substr $_, 1, 2 : map { sprintf q{%02x}, ord } split m{}; } @$_; } map { s{^Receive:}{}; s{\s+}{}g; [ split m{(\[\d\d\])} ]; } grep { m{^Receive:} } <$logFH>; }; say qq{$_\n} for @records; #### map { join q{ }, map { m{\[\d\d\]} ? substr $_, 1, 2 : map { sprintf q{%02x}, ord } split m{}; } @$_; } map { [ split m{(\[\d\d\])} ] } map { s{^Receive:}{}; s{\s+}{}g; $_; } grep { m{^Receive:} } <$logFH>;