### HEADING OF RECORD 1 #### Logical device ID=08E1 LINE_THAT_DOES_NOT_BOTHER_ME ANOTHER_LINE_THAT_DOES_NOT_BOTHER_ME 29 8/0/2/1/0.18.152.0.0.6.1 c29t6d1 FA 5eA 30 8/0/3/1/0.17.152.0.0.6.1 c30t6d1 FA 12e 31 8/0/8/1/0.17.150.0.0.6.1 c31t6d1 FA 10eA 32 8/0/9/1/0.18.150.0.0.6.1 c32t6d1 FA 11eA ### HEADING OF RECORD 2 #### Logical device ID=08E2 LINE_THAT_DOES_NOT_BOTHER_ME ANOTHER_LINE_THAT_DOES_NOT_BOTHER_ME 29 8/0/2/1/0.18.152.0.0.4.1 c29t4d1 FA 5eA 30 8/0/3/1/0.17.152.0.0.4.1 c30t4d1 FA 12eA 31 8/0/8/1/0.17.150.0.0.4.1 c31t4d1 FA 10eA 32 8/0/9/1/0.18.150.0.0.4.1 c32t4d1 FA 11eA ### HEADING OF RECORD 3 #### (...) #### %hash = ( '08E1' => ['c29t6d1','c30t6d1','c31t6d1','c32t6d1'], '08E2' => ['c29t4d1','c30t4d1','c31t41','c32t4d1'], (...) ) #### use strict; use warnings; use Data::Dumper; my %hash; open ( FH, "powermt display dev=all|");# data stream comes from here $/ = ''; while () { my ($id) = ( $_ =~ /Logical device ID=(\w+)/ ); push (@{$hash{$id}}, $1) if /(c\d+t\d+d\d+)/; } print Dumper (\%hash); #### $VAR1 = { '08E1' => [ 'c29t6d1' ], '08E2' => [ 'c29t4d1' ], (...)