2010-09-07 6 views
4

J'utilise Getopt::Std dans un script Perl, et je voudrais passer un zéro comme valeur. Je vérifie que les valeurs sont correctement définies en utilisant unless(). À l'instant unless() rejette la valeur comme n'étant pas définie.Transmettre zéro à Getopt :: Std

Existe-t-il un moyen d'obtenir unless() pour accepter zéro comme valeur valide (tout nombre entier non négatif est valide).

C'est probablement très simple, mais je n'ai jamais touché Perl il y a quelques jours!

Rich

+2

Que voulez-vous dire par «passer zéro comme une valeur? Est-ce une option de ligne de commande - comme dans '' cmd -0' '(comparable à 'xargs -0')? Ou comme l'un des arguments de la fonction 'getopt' de' Getopt :: Std'? Comme écrit, votre question n'est pas claire. –

+0

Désolé, vous avez raison. Je veux faire 'perl myScript -c 0' et' unless ($ opt_c) 'pour retourner true. – Rich

Répondre

9

Vous devez utiliser unless defined <SOMETHING> au lieu de unless <SOMETHING>, car zéro est faux en Perl.

3

Perl 5 a several false values: 0, "0", "", undef, ().

Il est important de noter que certaines choses peuvent sembler fausses, mais ne le sont pas. Par exemple 0.0 est faux car c'est un nombre qui est équivalent à 0, mais "0.0" ne l'est pas (les seules chaînes qui sont fausses sont la chaîne vide ("") et "0").

Il a également le concept de définition. Une variable dont la valeur (autre que undef) lui est affectée est définie comme définie et retournera vrai lorsqu'elle sera testée avec la fonction defined.

Étant donné que vous voulez un argument pour un entier non négatif, il est probablement préférable de tester que:

unless (defined $value and $value =~ /^[0-9]+$/) { 
    #blah 
}