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 :

Type de variable scalaire


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut Type de variable scalaire
    Bonjour,

    Je voudrais savoir si il existe une fonction qui permet de détecter quel type de variable un scalaire est.

    Plus précisément, j'ai une variable $argument et je veux savoir si c'est un type String (chaine de caractère), Integer (entier) ou Real (chiffres à virgules).

    Merci d'avance pour vos réponses.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Par défaut
    Le module POSIX intègre des fonctions pour ça, si j'ai bonne mémoire.
    Mais, au pire, il existe des tests simples pour déterminer le type d'un scalaire.
    En voici quelques uns :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach my $a qw(5 4.4 0 -1.2 asdf 12asdf asdf12 1.2e3 0e0) {
      if (($a * 1) ne $a ) {
        print $a." is a string\n";
      } elsif (int($a) == $a) {
        print $a." is an integer\n";
      } elsif ($a=~/^[-+]?\d+\.?\d*$/) {
        print $a." is a float\n";
      }  
    }

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut
    D'accord je vais essayé cette solution Est ce que tu pourrais commenter ce petit code, parce que je n'ai pas compris les trois premières lignes.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach my $a qw(5 4.4 0 -1.2 asdf 12asdf asdf12 1.2e3 0e0) { #0
      if (($a * 1) ne $a ) { #1
        print $a." is a string\n";
      } elsif (int($a) == $a) { #2
        print $a." is an integer\n";
      } elsif ($a=~/^[-+]?\d+\.?\d*$/) { #3
        print $a." is a float\n";
      }  
    }
    0. On construit une liste de valeurs et on les teste une à une.

    1. En multipliant $a par 1, on demande à le convertir en nombre, si possible. Or, une chaîne comme "12abc" sera convertie en "12" et "abc12" en 0.
    Elle ne sera donc pas égale à elle-même si c'est une chaîne : "24" *1 == "24"
    "12abc" * 1 == "12" != "12abc"...

    2. la routine int() permet de récupérer la partie entière d'un nombre (on sait que ça en est un puisque le test 1 a échoué). int() retourne la même valeur que $a, alors on sait que c'est un entier.

    3. Si $a matche avec une chaîne commençant par '-' ou '+' puis que des nombres et éventuellement un point et à nouveau des nombres, alors c'est un flottant.
    Ce dernier test permet de savoir s'il s'agit d'un nombre de manière générale. Mais comme si c'était un entier, le test précédent aurait été vrai, on sait que c'est un flottant.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut
    Je viens de tester, et à priori c'est parfaitement ce que je recherchai. Par contre, j'ai des warning pour ces arguments :

    04-Mar-2011
    STI7105IUD/A32
    2210113QZP
    DEF

    message : Argument "DEF" isn' numeric in multiplication (*)

    C'est une réaction normal je pense. En tout cas, ça fait exactement ce que je désire.

    Autre chose pour cet argument : 06.29, il le détecte comme un string. Peut être à cause du "0" devant (?).

    En tout cas merci.

  6. #6
    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
    La question de savoir si un scalaire est une chaine ne se pose pas vraiment : un scalaire peut toujours être une chaine (sauf les références, qu'il faut tester avec la fonction ref).
    Ne se pose alors que la question de savoir si un scalaire peut être entier ou flottant, et considérer que s'il n'est ni l'un, ni l'autre, c'est une chaine.

    En revanche, effectuer des tests numériques sur un scalaire qui n'est pas numérique génère des warnings. Par ailleurs, comme tu l'as relevé, cette méthode comporte certaines limites.

    Par contre, il existe des modules qui testent les types numériques : l'un d'eux Scalar::Util::Numeric (voir la liste des SEE ALSO)

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

Discussions similaires

  1. Type et variable
    Par cloogy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/12/2004, 15h07
  2. [SQL S 2000] Type de variable ?
    Par Tankian dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/06/2004, 14h03
  3. Assembleur et type de variable delphi
    Par declencher dans le forum Langage
    Réponses: 5
    Dernier message: 20/06/2004, 23h21
  4. Comparer les types de variable
    Par onipif dans le forum ASP
    Réponses: 11
    Dernier message: 27/05/2004, 18h07
  5. Types de variables entre mysql/php et flash
    Par ramses83 dans le forum Flash
    Réponses: 2
    Dernier message: 06/10/2003, 18h35

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