use Data::Dumper; my $s1 = 'X -4 Y 3 Z'; my $s2 = 'W 1 X -4 Y 3 Z'; my $s3 = 'X 2 Y'; my $s4 = 'A -4 B -4 C -4 A -4 B'; decomp_str($s1); decomp_str($s2); decomp_str($s3); decomp_str($s4); sub decomp_str { my @dcomp; $_ = shift; while( /^(\S\s+\S+\s+)(\S)(.*)$/ ) { push @dcomp, $1 . $2; $_ = $2 . $3; } ( length() == 1 ) or die( "Syntax error: $_\n" ); print Dumper \@dcomp; return \@dcomp; }