IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

negation d un string


Sujet :

Langage Perl

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut [regex], [substr], [grep]: compter nombre d occurence, substitution d un vecteur
    Salut tout le monde!

    j ai ecris ce petit code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    use strict;
    use String;
     
    my $str = new String("1000");
     
    my $bit_least =$str->charAt(3), "\n";
    print $bit_least, "\n";
    print !$bit_least, "\n";
     
    my $bit_most =$str->charAt(0), "\n";
    print $bit_most, "\n";
    print !$bit_most;
    et j ai eu ce resulat:
    C:\Perl\bin>perl u:\souce_code_perl\string.pl
    0
    1
    1

    C:\Perl\bin>
    mais j ai voulu un resultat comme ca:
    C:\Perl\bin>perl u:\souce_code_perl\string.pl
    0
    1
    1
    0
    C:\Perl\bin>
    je ne sais pas pourquoi ca marche pas!

    Merci pour votre aide!

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    print interpréte ton !$bit_most comme une valeur booleenne fausse qu'il retraduit en chaine vide.
    Pour garder une valeur numérique, écrit plutôt :

    print 0+$bit
    ou
    print 0+!$bit

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut
    Merci!

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    String est un module profondément inutile, n'ajoutant absolument rien aux strings classiques de Perl... Si tu veux manipuler des vecteurs de bits, utilise plutôt un module efficient et dédié à cela tel que Bit::Vector.

    --
    Jedaï

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut
    Merci Jedai!
    j essaye d utiliser Bit::Vector.

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut
    Bonjour tout le monde!

    j ai ecris ce moreau de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #!/usr/bin/perl -w
    use strict;
    use warnings;
     
    print "CAN-Mapping : ", "\n";
    my $can_map = <STDIN>;
    chomp $can_map;
    print "CAN Mapping values: ", "\n";
     
    &can_mapping($can_map);
     
     
     
    sub can_mapping 
    {
      my $can_mapping = shift @_;
      $can_mapping =~ s/\s//g;
      my $count_=()= $can_mapping =~ m/\d/g;
      my %hash_can_mapping=();
      my %mapping=();
     
      for (1..$count_)
      {
        (#le probleme est ici! 
          my $new_can_mapping = $can_mapping) =~ s/[0-1]/int(rand(2))/ge;
         #le probleme est ici!
     
    	 $new_can_mapping =~ s/-/int(rand(2))/ge;
    	redo if (exists $mapping{$new_can_mapping});
    	$mapping{$new_can_mapping}=1;
     
        my $bin_prefix="0b";
        my $can_mapping_bin = $bin_prefix.$new_can_mapping;
        my $can_mapping_dec = oct($can_mapping_bin); 
    	$hash_can_mapping{$new_can_mapping}=$can_mapping_dec;
      }
     
      foreach my $new_can_mapping(keys %hash_can_mapping)
      {
    	print $new_can_mapping, "=>", $hash_can_mapping{$new_can_mapping}, "\n"; 
      }
     
      return;
    }
    et voila le resultat:
    CAN-Mapping:
    1--- 0000
    CAN Mapping values:
    01101010=>106
    00111000=>56
    10101100=>172
    00011010=>26
    10100011=>163
    Maintenant j essaye d etre clair ou est mon probleme:
    mon input est un vecteur ou il y a des dont care bits et des bit bit bien preci
    (ici 1--- 0000)
    dans mon output je veux remplacer les dont care par des 1 et 0 aléatoirement et j ai fais deja ca avec la fonction rand!
    mon probleme est avec les autres bits!!!
    je veux les remplacer un par un!
    un exemple concret:
    input: 1--- 0000

    output: 5 vecteurs!
    0010 0000
    1010 1000
    1010 0100
    1010 0010
    1010 0001

    ci l exemple etait:
    input: 1000
    output serai: 4 vecteurs!
    0000
    1100
    1010
    1001

    j espere que j ai posé mon probleme de maniere claire!
    Merci pour votre aide!

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Vu qu'il s'agit plus de traitement de chaine que de traitement de vecteurs de bit, je propose quelque chose qui reste un traitement de chaine de caractère basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ perl -e '$a = "1000";foreach $pos (0 .. length $a - 1) { substr(($b = $a), $pos, 1) = ~int(substr $a, $pos, 1) & 1; ; print "$b\n"}'
    qui fournit bien la liste demandée

  8. #8
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut
    Merci Philou pour ton aide!
    ca m eclaire un peu.

    Mais..
    1- c est un cas particulier (le "1000") le cas general c est
    ("1--1 00--" par exemple).
    2- comment integrer ton idée dans mon code car j ai essayé ca et ca m a pas donné le resultat cherché

    Merci encore!

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut
    j ai modifié mon code de la maniere suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    # !/usr/bin/perl -w
    use strict;
    use warnings;
     
    print "CAN-Mapping: ", "\n";
    my $can_map = <STDIN>;
    chomp $can_map;
    print "CAN Mapping values: ", "\n";
     
    &can_mapping($can_map);
     
     
     
    sub can_mapping 
    {
      my $can_mapping = shift @_;
      $can_mapping =~ s/\s//g;
      my %hash_can_mapping=();
     $can_mapping =~ s/-/int(rand(2))/ge;
      foreach my $pos (0 .. length $can_mapping - 1)
      {
    substr(($b = $can_mapping), $pos, 1) = ~int(substr $can_mapping, $pos, 1) & 1;  
     
        my $bin_prefix="0b";
        my $can_mapping_bin = $bin_prefix.$b;
        my $can_mapping_dec = oct($can_mapping_bin); 
    	$hash_can_mapping{$b}=$can_mapping_dec;
      }
     
      foreach my $b(keys %hash_can_mapping)
      {
    	print $b, "=>", $hash_can_mapping{$b}, "\n"; 
      }
     
      return;
    }
    et j ai obtenu le resultat suivant:
    CAN-Mapping:
    1000 ----
    CAN Mapping values:
    Argument "" isn't numeric in int at U:\souce_code_perl\can_mapping1.3.pl line 22, <STDIN> line 1.
    10000000=>128
    11000010=>194
    10000011=>131
    10100010=>162
    00000010=>2
    10000110=>134
    10001010=>138
    100000101=>261
    10010010=>146
    Merci pour votre aide!

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Tu dois faire la substitution des "-" après celle qui consiste à inverser les bits, car sinon, tu inverseras aussi les bits pris au hasard (ce qui n'est pas si grave), mais surtout, le nombre de substitution ne correspondra pas à ce que tu demandes.
    Il faut donc aussi que tu filtres dans la boucle, les seuls indices correspondants à des valeurs numériques :

    Essaye donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    sub can_mapping 
    {
      my $can_mapping = shift @_;
      $can_mapping =~ s/\s//g;
      my %hash_can_mapping=();
      foreach my $pos (grep substr($can_mapping, $_, $1) =~ /\d/, 0 .. length $can_mapping - 1)
      {
        substr(($b = $can_mapping), $pos, 1) = ~int(substr $can_mapping, $pos, 1) & 1;  
        $can_mapping =~ s/-/int(rand(2))/ge;
        my $bin_prefix="0b";
        my $can_mapping_bin = $bin_prefix.$b;
        my $can_mapping_dec = oct($can_mapping_bin); 
     
        $hash_can_mapping{$b}=$can_mapping_dec;
      }
     
      foreach my $b(keys %hash_can_mapping)
      {
    	print $b, "=>", $hash_can_mapping{$b}, "\n"; 
      }
     
      return;
    }

  11. #11
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut
    encore merci!

    mais...
    1- j ai essayé ton code et voila le resultat pour 3 exemples:
    C:\Perl\bin>perl U:\souce_code_perl\can_mapping1.3.pl
    CAN-Mapping:
    1000 ----
    Argument "1000----" isn't numeric in subtraction (-) at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.

    C:\Perl\bin>perl U:\souce_code_perl\can_mapping1.3.pl
    CAN-Mapping:
    1-1- 0-1-0
    Argument "1-1-0-1-0" isn't numeric in subtraction (-) at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.

    C:\Perl\bin>perl U:\souce_code_perl\can_mapping1.3.pl
    CAN-Mapping:
    1000
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    Use of uninitialized value $1 in substr at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    J ai subsitué les (-) avant pour ne pas avoir cette erreur:
    Argument "......." isn't numeric in subtraction (-) at U:\souce_code_perl\can_mapping1.3.pl line 47, <STDIN> line 1.
    2- j arrives pas a comprendre ces lignes:
    foreach my $pos (grep substr($can_mapping, $_, $1) =~ /\d/, 0 .. length $can_mapping - 1)
    et
    substr(($b = $can_mapping), $pos, 1) = ~int(substr $can_mapping, $pos, 1) & 1;
    merci pour votre aide.

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Mmmhh... désolé, j'avais pas corrigé cette erreur en postant (un malheureux $ devant un 1). Voici le code, et un peu plus tard, les explications que tu as demandées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    can_mapping($ARGV[0]);
     
    sub can_mapping
    {
      my $can_mapping = shift @_;
      $can_mapping =~ s/\s//g;
      my %hash_can_mapping=();
      foreach my $pos (grep substr($can_mapping, $_, 1) =~ /\d/, 0 .. length($can_mapping)- 1)
      {
        substr(($b = $can_mapping), $pos, 1) = ~int(substr $can_mapping, $pos, 1) & 1;
        $b =~ s/-/int(rand(2))/ge;
        my $bin_prefix="0b";
        my $can_mapping_bin = $bin_prefix.$b;
        my $can_mapping_dec = oct($can_mapping_bin);
     
        $hash_can_mapping{$b}=$can_mapping_dec;
      }
     
      foreach my $b(sort keys %hash_can_mapping)
      {
            print $b, "=>", $hash_can_mapping{$b}, "\n";
      }
     
      return;
    }

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par ellgafsi Voir le message
    2- j arrives pas a comprendre ces lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $pos (grep substr($can_mapping, $_, 1) =~ /\d/, 0 .. length($can_mapping) - 1)
    La boucle définie par cette instruction défini $pos comme étant successivement toutes les valeurs retournées par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep substr($can_mapping, $_, $1) =~ /\d/, 0 .. length $can_mapping - 1
    Ces valeurs sont le résultat d'un filtrage (grep) des valeurs retournées par l'expression 0 .. length($can_mapping) -1, c'est à dire 0, 1, 2, ... jusqu'au dernier indice valide dans la chaine $can_mapping.
    Le filtrage opéré est basé sur l'expression substr($can_mapping, $_, 1) =~ /\d/. Pour chaque élément de la liste fournie (contenu dans $_), ce filtre est exécuté, et s'il retourne une valeur vraie, l'élément de la liste est retournée par grep, sinon, il est filtré et n'apparait pas dans la liste retournée par grep.

    Ainsi, la boucle passe en revue tous les caractères de la chaine $can_mapping qui correspondent à des chiffres (motif /\d/).
    Citation Envoyé par ellgafsi Voir le message
    2- j arrives pas a comprendre ces lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substr(($b = $can_mapping), $pos, 1) = ~int(substr $can_mapping, $pos, 1) & 1;
    Cette expression est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $b = $can_mapping;substr($b, $pos, 1, ~int(substr $can_mapping, $pos, 1) & 1);
    C'est à dire que l'on copie $can_mapping dans $b, puis qu'on substitue le caractère en position $pos par son inverse au sens binaire.

  14. #14
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut
    Merci infiniment Philou pour les explications!

    j ai corrigé la faute ($ avant 1) mais ca marche pas encore.
    lorsque j execute le code avec cet exemple: 1--- 0000
    j obtiens ca:

    CAN-Mapping:
    1--- 0000
    01100000=>96
    10100001=>161
    11000010=>194
    11000100=>196
    11011000=>216
    normalement le resultat sois comme ca:
    CAN-Mapping:
    1--- 0000
    01100000=>96
    11011000=>216
    11000100=>196
    11000010=>194
    10100001=>161
    Merci!

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Le résultat est correct, c'est simplement l'ordre d'affichage qui est différent.
    En fait, tu as introduit tes valeurs dans une table de hachage, et lors de la restitution, ils sont présentés de manière aléatoire (ou triés arbitrairement dans l'exemple que je t'ai fourni).

    Tu as donc deux solutions :
    - soit tu les présente dans l'ordre de leur calcul, et dans ce cas, tu dois ranger les valeurs dans un tableau plutôt qu'une table de hashage (@array_can_mapping)
    - soit tu es capable de trouver une méthode de tri des éléments dans la table de hashage pour les afficher, comme la valeur numérique du nombre obtenu :
    (dans l'exemple fourni précédement, c'est l'ordre alphabétique de la chaine des bits) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      foreach my $b(sort {$hash_can_mapping{$a} <=> $hash_can_mapping{$b} } keys %hash_can_mapping)
      {
            print $b, "=>", $hash_can_mapping{$b}, "\n";
      }

  16. #16
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Par défaut
    Merci camarde!

    ps: comment changer le titre de la discution?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  2. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo