#!/usr/bin/perl require 5.006; use strict; use warnings; $|++; my $infile = "t-printerstatus.input"; open( inputFH, "<", $infile ) or die "Can't open $infile for reading: $!\n"; my $logfile = "t-printerstatus.output"; open ( logFH, ">", $logfile ) or die "can't open $logfile for writing: $!\n"; my %printer_info = (); { ## set the input record separator to a double-newline local $/ = "\n\n"; while( my $record = ) { ## seperate the items in the record ## the first item is the key to the printer_info hash ## an item ends with a newline not followed by ## spaces and an open parenthesis my( $key, @item ) = split /(?x) \n (?! \s+ \( )/, $record; ## remove all leading whitespace from each item s/^\s*// for @item; ## split each item on a colon, ## add to the key in the printer_info hash for( @item ) { my( $name, $value ) = split /:\s+/, $_; @{ $printer_info{$key} }{$name} = $value; } } } use Data::Dumper; $Data::Dumper::Indent = 1; print Dumper \%printer_info; #### .