use warnings; use strict; chomp( my @horiz = ); my @dates = grep length, split /\|/, shift @horiz; for my $line ( @horiz ) { my ( undef, $PID, $SID, @flds ) = split /\|/, $line, -1; for my $date ( @dates ) { print "$PID|$SID|", shift( @flds ), "|$date\n"; } }