in reply to Matching wirth ordered array

Sorting by the length starting from the longest is a common way. Instead of looping over the dictionary, you can build a regex from all the terms, and return the translation based on the matching part. Also, storing the dictionary in a hash makes retrieving the translation easier and faster. Something like the following:
#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use utf8; use open 'OUT', ':encoding(UTF-8)', ':std'; my %dictionary = ( 'animal source food' => 'aliment d’origine animale', 'balanced diet' => 'régime alimentaire équilibré', 'food' => 'aliment', 'nutrition' => 'nutrition', 'nutrition assessment' => 'évaluation de l’état nutritionnel' ); my $text = 'nutrition and animal source food or nutrition assessment'; my $regex = join '|', map quotemeta, sort { length $b <=> length $a } keys %dictionary; while ($text =~ /($regex)/g) { say $dictionary{$1}; }

Output:

nutrition aliment d’origine animale évaluation de l’état nutritionnel

map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]