Tu devrais lui faire afficher ta troisième capture ($3) au lieu de la ligne $line. Tu peux aussi simplifier (et raffiner) ta regex.
Voilà un exemple (qui en fait un peu plus, en matière de capture et d'affichage), qui devrait te permettre de progresser.
1 2 3 4 5
| my %products;
while (<FILE>) {
$products{$2} += $1 if (/\^[(\d+)\].*: ([\w| ]*)$/);
}
print map {"$_ $products{$_}\n"} sort keys %products; |
La capture est à la fois plus simple (je prends que ce dont j'ai besoin) et plus précise (j'en dis plus sur où il faut prendre).
Rappel :^ et $ sont les ancres de début et de fin de chaîne. La précision permet d'éviter les lignes qui ne comment pas par [\d+].
\d pour chiffre, \w pour alphanumérique et | alternative
L'utilisation d'un tableau associatif (hash) te permets de compter les éléments (tu n'es pas obligé!), tout en stockant le nom des produits. Clé du hash = nom et valeur du hash = nombre (avec incrémentation si déjà présent).
le map {} prend une liste en entrée (liste des clés du hash) et recrache une liste de chaînes (en l'occurence la clé et sa valeur) à print.
Partager