my $re_langs = sprintf '(?:%s)', join '|', keys %validLanguages;
####
$text =~ /^(?:$re_langs|\s|,)*\z/;
####
$text =~ /^(?:$re_langs(?=\s|,|\z)|\s|,)*\z/;
####
$text =~ /^(?:$re_langs\b|\s|,)*\z/;
####
$text =~ m{
^
(?: $re_langs \b
| \s
| , (?! \s*, ) # comma not followed by another comma
# (not even with intervening whitespace)
)*
\z
}x;
####
$text =~ m{
^
\s* ( ,\s* )? # allow stuff to precede first language
(?: $re_langs
(?: \s+
| \s* , \s*
| \z
)
)* \z
}x;
####
$text =~ /^\s*(?:$re_langs\s*(?:,\s*|\z))*\z/;