#!/usr/bin/perl use warnings; use strict; use Data::Dumper; my @AoH; my $rec; my $re = join '|' ,'(?ether)\s+(?.*$)' ,'(?media):\s+(?\w+)' ,'(?inet)\s+(?\w+\.\w+\.\w+\.\w+)' ,'(?status): (?\w+)' ,'(?broadcast)\s+(?\w+\.\w+\.\w+\.\w+)' ,'(?netmask)\s+(?\w+)' ,'(?mtu)\s+(?\d+)' ,'(?prefixlen)\s+(?\d+)'; open my $fh, '<', 'interface.txt' or die; while (<$fh>) { chomp; if (/^(\w+\d{1}):\s+flags=(.*?>)/){ $rec = {}; push @AoH, $rec; $rec->{'interface'} = $1; $rec->{'flags'} = $2; } while (/$re/g) { $rec->{$+{k}} = $+{v}; } } close $fh; print Dumper \@AoH;