#!/usr/bin/perl use strict; use warnings; my $file = $ARGV[0] or die "Usage: $0 "; open(my $fh, '<', $file) or die "Unable to open '$file' for reading: $!"; my ($curr_key, @rec) = ('', ()); while (<$fh>) { chomp; my $entry = parse_line($_); if ($entry->{key} ne $curr_key) { process_rec($curr_key, \@rec); ($curr_key, @rec) = ($entry->{key}, $entry); } else { push @rec, $entry; } } process_rec($curr_key, \@rec); sub parse_line { my ($line) = @_; my %entry; # ... return \%entry; } sub process_rec { my ($key, $rec) = @_; return if ! @$rec; # ... }