#! perl -slw use strict; use Data::Dumper; my %hash = map{ my( $free, $name, $size ) = m[ ^ (?= .* FreeSpace \s+ = \s+ " ( [^"]+ ) "; ) #" (?= .* Name \s+ = \s+ " ( [^"]+ ) "; ) #" (?= .* Size \s+ = \s+ " ( [^"]+ ) "; ) #" ]smx or warn "Bad record '$_'"; $name ? ( $name => { freespace => $free, size => $size } ) : (); } do{ local $/ = "\n};\n"; }; print Dumper \%hash; __DATA__ #### P:\test>junk $VAR1 = { 'C:' => { 'freespace' => '114151464960', 'size' => '160031014912' }, 'D:' => { 'freespace' => '5515554816', 'size' => '203921108992' }, 'H:' => { 'freespace' => '43128733696', 'size' => '400086708224' } };