Comment définir une valeur par défaut pour une variable Perl?

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

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

print "$user_agent $os_namen";

il y a des agents utilisateurs qui ne sont pas des agents utilisateurs du navigateur, donc ils n'obtiendront aucune valeur à partir d'os_string. J'obtiens une erreur Use of uninitialized value $os_name in concatenation (.) or string

comment gérer de tels cas quand $os_name n'est pas initialisé parce que la méthode os_string retourne undef (c'est ce que je pense qui arrive 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 exemple pas D'OS dans ces cas.

13
demandé sur brian d foy 2010-10-18 16:22:13

3 réponses

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).

17
répondu cHao 2010-10-18 15:03:49

s'il vous Plaît note: l'original de la réplique de l'approche ( $var = EXPRESSION || $default_value) produirait la valeur par défaut pour toutes les "Perl false values" retournées à partir de l'expression, par exemple si l'expression est une chaîne vide, vous utiliserez la valeur par défaut à la place.

dans votre exemple particulier, 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 ce que vous vouliez réellement était d'utiliser seulement la valeur par défaut au lieu de undef.

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

  • Perl 5.10 et plus tard: utiliser le "défini-ou de l'exploitant" (//):

    my $os_name = $ua->os_string() // 'No OS';
    
  • Perl 5.8 et versions antérieures: utilisez un opérateur conditionnel parce que défini-ou n'é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';
    

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

27
répondu DVK 2013-07-08 16:52:36

vous cherchez defined?

1
répondu dvhh 2010-10-18 15:53:58