use Parse::RecDescent;
use Data::Dumper; $|++;
my $parser = Parse::RecDescent->new(q{
line: word(s) /\z/ {
my @words = @{$item[1]};
my %count;
(grep ++$count{$_} > 1, @words) ? undef : \@words;
}
word: "one" | "two" | "three"
}) or die;
for ("one two", "one one", "two three one", "three one two one") {
print "$_ =>\n";
print Dumper($parser->line($_));
}
# which generates:
one two =>
$VAR1 = [
'one',
'two'
];
one one =>
$VAR1 = undef;
two three one =>
$VAR1 = [
'two',
'three',
'one'
];
three one two one =>
$VAR1 = undef;