[perl] vérifier variable numérique

Bonjour,

j'essaie en perl de vérifier si une variable en argument d'un script est numérique.

J'ai testé avec succès :
if ($ARGV[2] =~ m/^\d+$/){print "Argument '".$ARGV[2]."' numérique.\n";}

En revanche, je ne parviens pas à utiliser le NOT (pour obtenir le contraire) :

if (!$ARGV[2] =~ m/^\d+$/){print "Argument '".$ARGV[2]."' non numérique.\n";}
=> marche po
if ($ARGV[2] !=~ m/^\d+$/){print "Argument '".$ARGV[2]."' non numérique.\n";}
=> marche po
if !($ARGV[2] =~ m/^\d+$/){print "Argument '".$ARGV[2]."' non numérique.\n";}
=> marche po

Merci :-)
Configuration: Windows XP
Firefox 2.0.0.11

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Pour l'info

    !~ ce n'est pas tout à fait une négation

    cet opérateur veut plutôt dire de trouver la non-correspondance et pas de ne pas trouver la correspondance
    1. Modérateur
      une autre possibilité de tester le non numérique c'est avec la classe de caractères complémenté \D qui cherche les caractères non numérique
      root@debian:~# perl -e 'print "non numérique\n" if ("aaa" =~ /^\D+$/)'
      non numérique
      comme ça je n'ai pas besoin de nier
      je cherche tout simplement une correspondance non-numérique
      1. Modérateur
        ou
         perl -e '"aaa"=~/^\d+$/?"":print "non numérique\n"'
        
        1. Modérateur
          Salut,

          voici quelques tests
          root@debian:~# perl -e 'print "non numérique\n" if ("aaa" !~ /^\d+$/)'
          non numérique
          root@debian:~# perl -e 'print "non numérique\n" if (!("aaa" =~ /^\d+$/))'
          non numérique
          root@debian:~# perl -e 'print "non numérique\n" unless ("aaa" =~ /^\d+$/)'
          non numérique
          
          1. Contributeur
            Salut.
            Je ne comprend pas pourquoi
            if (!$ARGV[2] =~ m/^\d+$/){print "Argument '".$ARGV[2]."' non numérique.\n";}
            ne fonctionne pas. A cause de la priorité des opérateurs ? est-ce qu'un
            if (!($ARGV[2] =~ m/^\d+$/)){print "Argument '".$ARGV[2]."' non numérique.\n";}
            fonctionnerai. Sinon, j'y comprends plus rien, le not sur un booléen doit toujours fonctionner normalement.
            1. Salut,

              la négation dans une regexp en perl, c'est: $chaine !~ m/$re/;

              Dans ton cas:

              print 'Argument '.$ARGV[2].' non numérique' if ($ARGV[2] !~ m/^\d+$/);

              Tu pouvais aussi faire:

              print "Argument ".$ARGV[2];
              if ( $ARGV[2] =~ m/^\d+$/ ) {
              print " numérique\n";
              }
              else {
              print " alphanumérique\n";
              }

              tout simplement ;)