#!/usr/bin/perl use 5.010; use strict; use warnings; while () { chomp; my @a; my $i = 0; while (/(!.|.)/g) { my $char = $1; if ($char eq ";") { $i++; next; } $char = $1 if $char =~ /!(.)/; $a[$i] .= $char; } say "@a"; } __DATA__ foo;bar foo!;bar;baz foo!!;bar!;baz;qux foo!!!;bar!!;baz!;qux;quux foo!!!!;bar!!!;baz!!;qux!;quux;garply foo!!!!!;bar!!!!;baz!!!;qux!!;quux!;garply;waldo #### foo bar foo;bar baz foo! bar;baz qux foo!;bar! baz;qux quux foo!! bar!;baz! qux;quux garply foo!!;bar!! baz!;qux! quux;garply waldo