#!/usr/bin/perl -l use strict; use warnings; use Data::Dumper; my $data = do {local $/;}; my @sent = split /[.!?]\B/,$data; my @parsed; for my $i (0 .. $#sent) { next if $sent[$i] =~ /^$/; my @word = map $_ || (), split /\s+/,$sent[$i]; for (my $j = 0; $j < @word; $j += 2) { push @{ $parsed[$i] }, [ $word[$j], $word[$j+1] ]; } } print Dumper \@parsed; # second pair from second sentance (should be 'a test') print join ' ', @{$parsed[1]->[1]}; __DATA__ This is Joe. This is a test. This is not a test. Blah blah isn't this fun? I wish you were here! Nah ...