2010-10-18 3 views
13

Je suis complètement nouveau à Perl. J'avais besoin d'utiliser un module externe HTTP :: BrowserDetect. Je testais du code et essayais d'obtenir le nom du système d'exploitation à partir de la méthode os_string. Donc, j'ai simplement initialisé l'objet et créé une variable pour stocker la valeur retournée.Comment puis-je définir une valeur par défaut pour une variable Perl?

my $ua = HTTP::BrowserDetect->new($user_agent); 
my $os_name = $ua->os_string(); 

print "$user_agent $os_name\n"; 

il y a des agents utilisateurs qui ne sont pas les agents utilisateurs du navigateur afin qu'ils n'obtenir une valeur de os_string. J'obtiens une erreur

Comment gérer de tels cas quand le $ os_name n'est pas initialisé parce que la méthode os_string retourne undef (c'est ce que je pense en lisant le code source du module). Je suppose qu'il devrait y avoir un moyen de donner une chaîne par défaut, par ex. Pas d'OS dans ces cas.

Répondre

17
my $os_name = $ua->os_string() || 'No OS'; 

Si $ua->os_string() est falsy (ie: undef, zéro, ou la chaîne vide), puis la deuxième partie de l'expression || sera évaluée (et sera la valeur de l'expression).

+0

merci, c'était vraiment un problème très simple en effet :). – sfactor

26

Veuillez noter: l'approche de la réponse originale ($var = EXPRESSION || $default_value) produirait la valeur par défaut pour TOUTES les "fausses valeurs Perl" renvoyées à partir de l'expression, par ex. Si l'expression est une chaîne vide, vous utiliserez la valeur par défaut à la place. Dans votre exemple, c'est probablement la bonne chose à faire (le nom du système d'exploitation ne devrait pas être une chaîne vide), mais en général, cela peut être un bogue, si vous vouliez utiliser la valeur par défaut de undef.

Si vous ne voulez éviter undef valeurs, mais pas une chaîne vide ou des zéros, vous pouvez faire:

  • Perl 5.10 et versions ultérieures: utiliser le « défini ou opérateur » (//):

    my $os_name = $ua->os_string() // 'No OS'; 
    
  • Perl 5.8 et versions antérieures: utiliser un opérateur conditionnel parce que défini ou était pas encore disponible:

    my $os_string = $ua->os_string(); # Cache the value to optimize a bit 
    my $os_name = (defined $os_string) ? $os_string : 'No OS'; 
    # ... or, un-optimized version (sometimes more readable but rarely) 
    my $os_name = (defined $ua->os_string()) ? $ua->os_string() : 'No OS'; 
    

Beaucoup plus en profondeur regard sur le sujet (y compris des détails sur //) sont dans le poste de brian d foy ici: http://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/

+1

J'ai récemment introduit un bug dans mon code en utilisant l'approche '||'. Trouvé le problème avant ce poste, mais ne connaissait pas l'opérateur "défini-ou". Apprenez quelque chose de nouveau avec Perl tous les jours. – ThisSuitIsBlackNot

Questions connexes