use Text::CSV; use strict; use warnings; my ($in, $inhandle, $out, $outhandle, $csv, @fields, $prefix); $in = 'test.csv'; open ($inhandle, "<$in") || die; $out = 'testout.csv'; open ($outhandle, ">$out") || die; $csv = Text::CSV->new(); while (<$inhandle>) { chomp; $csv->parse($_); @fields = $csv->fields(); if ($fields[0] =~ s/\(([A-Z])\)\-\(([A-Z])\)$//) { $prefix = $fields[0]; for ($1..$2) { $fields[0] = "$prefix($_)"; $csv->combine(@fields); print $outhandle $csv->string() . "\n"; } } else { print $outhandle "$_\n"; } }