use warnings; use strict; my @horiz = ; chomp(@horiz); my @dates = split '\|', shift @horiz; splice @dates, 0, 3; for my $line (@horiz) { my @flds = split '\|', $line; shift @flds; my $PID = shift @flds; my $SID = shift @flds; my @dates_copy = @dates; for my $date (@dates_copy) { print "$PID|$SID|",shift(@flds),"|$date\n"; } } # for $line #### |||12/31/2007|1/1/2008|1/2/2008|1/3/2008|1/4/2008|1/5/2008| |3104|1|New Years|Holiday|Clinic||| |3104|2|New Years|Holiday|Clinic||| |3104|3|New Years|Holiday|Clinic||| |3104|4|New Years|Holiday|AofC Clin||| |3109|1|New Years|Holiday|Clinic||| |3109|2|New Years|Holiday|Clinic||| |3109|3|New Years|Holiday|Clinic||| |3109|4|New Years|Holiday|AofC Clin||||| #### 3104|1|New Years|12/31/2007 3104|1|Holiday|1/1/2008 3104|1|Clinic|1/2/2008 3104|1||1/3/2008 3104|1||1/4/2008 3104|1||1/5/2008 3104|2|New Years|12/31/2007 3104|2|Holiday|1/1/2008 3104|2|Clinic|1/2/2008 3104|2||1/3/2008 3104|2||1/4/2008 3104|2||1/5/2008 3104|3|New Years|12/31/2007 3104|3|Holiday|1/1/2008 3104|3|Clinic|1/2/2008 3104|3||1/3/2008 3104|3||1/4/2008 3104|3||1/5/2008 3104|4|New Years|12/31/2007 3104|4|Holiday|1/1/2008 3104|4|AofC Clin|1/2/2008 3104|4||1/3/2008 3104|4||1/4/2008 3104|4||1/5/2008 3109|1|New Years|12/31/2007 3109|1|Holiday|1/1/2008 3109|1|Clinic|1/2/2008 3109|1||1/3/2008 3109|1||1/4/2008 3109|1||1/5/2008 3109|2|New Years|12/31/2007 3109|2|Holiday|1/1/2008 3109|2|Clinic|1/2/2008 3109|2||1/3/2008 3109|2||1/4/2008 3109|2||1/5/2008 3109|3|New Years|12/31/2007 3109|3|Holiday|1/1/2008 3109|3|Clinic|1/2/2008 3109|3||1/3/2008 3109|3||1/4/2008 3109|3||1/5/2008 3109|4|New Years|12/31/2007 3109|4|Holiday|1/1/2008 3109|4|AofC Clin|1/2/2008 3109|4||1/3/2008 3109|4||1/4/2008 3109|4||1/5/2008