#!/usr/bin/perl use strict; use warnings; use Data::Dump qw(pp); #Data::Dumper is also great! my %recordState; #recordid=>OWNER|WATING=>line my $OwnerOrWaiting=""; while () { s/\s+$//; # delete trailing whitespace if (/^FILENAME/) { $OwnerOrWaiting = (split)[3]; } if (m|^/|) { my ($record_id) = (split)[1]; push @{$recordState{$record_id}{$OwnerOrWaiting}}, $_; } } sub get_fields { my $line = shift; my %fields; @fields{qw(FILENAME RECORD_ID M USER UNBR UNO TTY TIME DATE)} = split(' ', $line, 9); return %fields; } print "The record numbers are:\n"; print "\t$_\n" foreach (keys %recordState); # I don't know what kind of queries you want, but # for example print some basic data for any queue's that # have 2 or more people waiting... foreach my $recNum ( keys %recordState) { if ( @{$recordState{$recNum}{WAITING}} >= 2) { print "Hey, there are at least 2 guys in this crowd!\n"; foreach my $line ( @{$recordState{$recNum}{WAITING}} ) { my %temp = get_fields($line); #this next is a hash slice... print "@temp{'RECORD_ID','USER','TIME','DATE'}\n"; } } } print "Dumping data...\n"; foreach my $recHashref ( values %recordState) { print "OWNER $_\n", for @{$recHashref->{OWNER}}; print "WAITING $_\n", for @{$recHashref->{WAITING}}; } print pp(\%recordState); =OUTPUTS The record numbers are: 001!L!311895 001!10274882 00151120273 Hey, there are at least 2 guys in this crowd! 00151120273 jmorg 13:48:32 Jul 20 00151120273 gdavi 13:54:22 Jul 20 Dumping data... OWNER /prod-data/J 001!L!311895 X jmorg 2015244 134 s/109 13:48:32 Jul 20 WAITING /prod-data/J 001!L!311895 X jmorg 5713932 191 ts/46 14:01:42 Jul 20 OWNER /prod-datahi 001!10274882 X rfuse 3354796 61 ts/43 13:39:02 Jul 20 WAITING /prod-datahi 001!10274882 X jmorg 3584038 247 ts/49 13:39:22 Jul 20 OWNER /prod-data/J 00151120273 X jmorg 3584038 247 ts/49 13:38:12 Jul 20 WAITING /prod-data/J 00151120273 X jmorg 2015244 134 s/109 13:48:32 Jul 20 WAITING /prod-data/J 00151120273 X gdavi 1359996 62 ts/20 13:54:22 Jul 20 =cut