[Perl] Lecture de fichier+calcul en fct indx

Résolu
Mrkanter -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

voilà mon problème, je dois lire dans un fichier 2 lignes:
la première ressemble à ça:
ABC123|ABC456|DEF987|DEF654|DEF321...
La 2 eme ligne correspond aux valeurs de la 1 e ligne:
10|2|54|65|12

je dois regrouper les noms de la premiere ligne si les 3 premieres lettres sont identiques, (ABC: ABC123, ABC456 et DEF: DEF987, DEF654, DEF321), ABC devra contenir le total des ABC soit ABC=10+2=12 idem pour DEF, DEF=54+65+12=131.

Je ne sais absolument pas comment procéder (je débute en Perl). Pouvez vous m'aidez ?

Merci

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Les champs sont toujours séparés par | ?
    Il y a toujours une valeur correspondante dans la deuxième ligne?!
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Encore une chose.
    La 1ère ligne peut contenir des doublons?!
    Par exemple avoir ABC123 deux fois.
    0
  3. Mrkanter
     
    Les champs sont toujours séparés par |.
    Non, il ne peut pas y avoir de doublons et oui il y a toujours une valeur sur la deuxième ligne qui correspond au nom de la première.
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Voilà
    lami20j@debian:~/trash/ccm_perl$ cat somme_lig.pl
    #!/usr/bin/perl
    use strict;use warnings;
    
    my(@l,@n,%h,%somme);
    
    while(<DATA>){
      chomp;
      @l=split /\|/ if /^[A-Z]/;
      @n=split /\|/ if /^[0-9]/;
    }
    
    @h{@l}=@n;
    
    foreach (sort keys %h){
      /^(...)/;
      push @{$somme{$1}},$h{$_};
    }
    foreach (sort keys %somme){
      my $s = join "+",@{$somme{$_}};
      $s=~s/\s*//g;
      print "$_ = $s = ",eval $s,"\n";
    }
    __END__
    ABC123|ABC456|DEF987|DEF654|DEF321
    10|2|54|65|12
    lami20j@debian:~/trash/ccm_perl$ perl somme_lig.pl
    ABC = 10+2 = 12
    DEF = 12+65+54 = 131
    
    0