#!/usr/bin/perl use strict; use warnings; my $line; while ( defined ($line = )) { if ($line =~ /^name/) { $line = process_record ($line); redo if defined $line; # another name line } } sub process_record { my $line = shift; (my $name) = $line =~ /^name\s+(\w+)/; my %devices; while (defined ($line = ) and $line !~ /^name/) { if ( (my $device) = $line =~ /^device\s+(\w+\s+\w+)/) { $device =~ s/(\w+)\s+(\w+)/$1 $2/; $devices{$device}=1; } } print "$name:\n"; print " device $_\n" foreach keys %devices; return $line; } =PRINTS: Brian: device ipad 2001 Andrew: device ipad 2009 ryan: device ipad 2005 device cell 2009 =cut __DATA__ socks something name Brian shirt yellow socks black device ipad 2001 device ipad 2001 device ipad 2001 tag no tag 0 name Andrew shirt orange socks black device ipad 2009 tag no tag 0 name ryan shirt blue socks black device ipad 2005 device cell 2009 tag yes tag 1