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 :

[langage] Test sur un caractère


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut [langage] Test sur un caractère
    Bonjour

    Excusez un peu mais je suis béotien total sur Perl.
    Voici mon problème : J'ai une chaîne de caratère contenu dans une variable.
    En fait, ce string, représente un chemin absolu. Je veux repérer tous les caractères \ et placer leur position dans un tableau.
    Voici mon 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
     
    my @name = "C:\Machin\Toto\Tutu; 
    my @position;
    my $i=0;
    printf ("%d\n", length($name[0]));
    for ($i=0; $i<length($name[0]); $i++) {
    if ($name[$i] eq '\\') {
    push(@position, $i);
    }
    }
    printf ("\n");
    foreach(@position) {
    printf("%d ", @position);
    }
    Or, au final, mon tableau position est...vide
    Qu'ai-je raté ?

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Ca va, j'ai trouvé grâce à rindex !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  3. #3
    Membre expérimenté
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Par défaut
    Je te propose ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my $chemin = 'C:\Machin\Toto\Tutu';
    my @position;
    my $index;
    print "$chemin\n";
     
    if(($index = index($chemin,"\\")) != -1){
    	while($index != -1){
    		push(@position,$index);
    		$index = index($chemin,"\\",$index+1);
    	}
    }
    print "@position";
    Tu peux donner ton code aussi ? pour voir la diff ?

  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
    En perl, une string n'est pas un tableau, donc ici tu fais un tableau qui contient une string (ton chemin complet) et ensuite tu vérifies pour tous les éléments de ce tableau (il n'y en a qu'un seul) s'ils sont strictement égaux à \ ...
    Il faut utiliser substr, ou le faire avec une regex :
    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
     
    #!/usr/bin/perl
    use strict;
     
    my $name = "C:\\Machin\\Toto\\Tutu"; #Attention il faut mettre \\ pas \
    my @position;
     
    print length($name), "\n";
    foreach my $i ( 0..(length($name)-1) ) {
      if (substr($name, $i, 1) eq '\\') {
        push(@position, $i);
      }
    }
     
    print "\n";
    {
      local $, = "\n";
      print @position;
    }
    J'en ai profité pour rendre tout ça un peu plus Perl.

    On pourrait même faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/perl
    use strict;
     
    my $name = "C:\\Machin\\Toto\\Tutu"; #Attention il faut mettre \\ pas \
    my @position = grep { $_ } map { substr($name, $_, 1) eq '\\' and $_ } ( 0..(length($name)-1) );
     
    print "\n";
    {
      local $, = "\n";
      print @position;
    }
    Pour rendre ça plus amusant (ça marche pas si il y a un \ en position 0 mais bon...c'est facilement correctible).

    Et je ne parle pas des solutions avec des regexs, qui pourrait être vraiment plus courtes (mais peut-être un peu inutiles)...

    Maintenant, si c'est vraiment important et fait souvent (j'en doute un peu), il faudrait essayer de comparer avec une solution à base d'index().

    [Edit] Bon bah tout le monde a répondu pendant que j'écrivais donc bon...
    --
    Jedaï

  5. #5
    Membre expérimenté
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Par défaut
    index juste au dessus. Ca marche avec un \ devant... mais j'aime bien qd meme. Avec des regex, va pas falloir se perdre

    Sinon GLdavid vient du forum C ou il m'a si souvent aide... d'amitie.

    NB :

    "C:\\Machin\\Toto\\Tutu"; #Attention il faut mettre \\ pas \
    pas oblige ... il va sans doute bosser avec des simples \ ... mettre juste un '...

  6. #6
    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
    Mon premier script marche même si le \ est en première position. Avec ' ça marche, mais il faut mettre \\ et pas \ à la fin d'un chemin de dossier parce que sinon il croît que c'est ' qui est échappé.
    (mais le index() est sans doute plus rapide, non que ça soit vraiment important pour ce genre d'application mais bon...)

    Une solution avec une regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $name = "C:\\Machin\\Toto\\Tutu";
    my @position;
     
    $name =~ s/(\\)/ push (@position, pos $name) && "\\"/ge;

    --
    Jedaï

  7. #7
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Salut à vous tous !

    Merci de votre aide surtout à Choupi qui a bien compris mon origine 100% C-Java ! .
    En fait, ce que je voulais c'était obtenir la position du dernier '\' pour récupérer les caractères suivants. De sorte que de "C:\Toto\Bidule", je ne récupère que "Bidule".
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sub Relative_path {
    my($name) = @_;
    my($i) = rindex($name, '\\');
    my($nom) = substr($name, $i+1);
    return $nom;
    }
     
    my($nom) = &Relative_path($ARGV[$#$ARGV]);
    Et voilà, le tour est joué :o .
    Merci encore à vous !!!

    Et à bientôt car je crois que je reviendrais vous voir !!!

    @ ++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  8. #8
    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
    En fait, sans vouloir doucher ton enthousiasme, de un, cette fonction est disponible dans l'un des modules du Core de Perl, donc c'est pas la peine de la recoder, de deux même si tu veux la recoder, il suffit d'une regex...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sub Relative_path {
        return $_[0] =~ /\\([^\\]+)$/;
    }
    Voilà...

    --
    Jedaï

  9. #9
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Salut !

    Merci de ton post jedaï, mais comme je l'ai mentionné là-haut, je suis béotien complet en PERL !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

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

Discussions similaires

  1. [langage] probleme sur test d'une variable
    Par Melvine dans le forum Langage
    Réponses: 11
    Dernier message: 25/10/2006, 19h31
  2. Réponses: 2
    Dernier message: 04/05/2005, 14h52
  3. [langage] Avis sur Perl
    Par micdie dans le forum Langage
    Réponses: 3
    Dernier message: 30/10/2003, 15h21
  4. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47
  5. Réponses: 3
    Dernier message: 07/04/2003, 20h06

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