#!/usr/bin/perl use strict; use warnings; my %intros = (); open my $fh, '<', 'big_pipe_delimited_file' or die $!; while (<$fh>) { my ($intro) = /^(.*?)\|/; $intros{$intro} = 1; } my %introsh = (); for (keys %intros) { open $introsh{$_}, '>', 'big_pipe_delimited_file_' . $_ or die $!; } seek($fh, 0, 0) or die $!; while (my $line = <$fh>) { my ($intro) = $line =~ /^(.*?)\|/; print $introsh{$intro} $line; }