#!/usr/bin/perl use strict; use warnings; while (my $line = ) { if (my( $num, $root_name, $rest)=$line =~ /^\^(\d+)\s*%\s*(\w+)[. |]+(.+)\+$/) { my @sub_names = split /;\s*/,$rest; foreach my $sub_name (@sub_names) { my ($name1, $name2) = split /\s*-\s*/,$sub_name; print "\"$num\",\"$root_name\",\"$name1\",\"$name2\"\n"; } } } =Prints "46004","Tamerlane","Tamerlane","Sheridan" "46004","Tamerlane","Bajazet","Barry" "46004","Tamerlane","Moneses","A Gentleman" "46004","Tamerlane","Arpasia","Mrs. Furnival" "46004","Tamerlane","Selima","Mrs. Elmy" "46005","Hamlet","Hamlet","Sheridan" "46005","Hamlet","Polonius","J. Morris" "46005","Hamlet","Laertes","Lacy" "46005","Hamlet","Ophelia","Mrs. Storer" "46005","Hamlet","Queen","Mrs. Furnival" =cut __DATA__ ^46004 % Tamerlane.| Tamerlane - Sheridan; Bajazet - Barry; Moneses - A Gentleman; Arpasia - Mrs. Furnival; Selima - Mrs. Elmy; + ^46005 % Hamlet.| Hamlet - Sheridan; Polonius - J. Morris; Laertes- Lacy; Ophelia- Mrs. Storer; Queen - Mrs. Furnival; +