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/;