#!/usr/bin/perl

use strict;

my $string = "V NOM ADJ V V NOM ADJ ADV V NOM ADJ";
my $pat = "V NOM ADJ";
my $output = '';

my @pattern = getPattern($pat);
my @tokens = split (/\s/, $string);


#
# on boucle sur les tokens : pour chacun, on regarde si on trouve une correspondance avec le patron
# si ça matche, on place le résultat dans une variable tampon, sinon on reset le patron
# s'il y a match (autrement dit si le patron est vide), on affiche le résultat trouvé
#
while (@tokens) {
    if (locatePattern($tokens[0])) {
        $output .= $tokens[0].' '; 
        if (!@pattern) {
            print STDOUT $output;
            $output = '';
            @pattern = getPattern($pat);
        }
    }
    shift @tokens;
}

#
# locatePattern(string)
# Utilise un tableau pour de patrons de morphosyntaxiques
#    contenant un élément par entrée
# Si la chaîne passée en paramètres correspond au patron, on retourne 1
# Sinon, on remet éventuellement le compteur à zéro et on retourne 0
#
sub locatePattern {
    my $str = shift;

    if ($str eq $pattern[0]) {
        shift @pattern;
        return 1;
    }
    $output = '';
    @pattern = getPattern($pat);
    if ($str eq $pattern[0]) {
        shift @pattern;
        return 1;
    }
    return 0;
}

#
# getPattern(string)
# Renvoie un array
#
sub getPattern {
    return split (/\s/, $_[0]);
}