Как я могу установить значение по умолчанию для переменной Perl?

Я совершенно новичок в Perl. Мне нужно было использовать внешний модуль HTTP::BrowserDetect. Я тестировал некоторый код и пытался получить имя ОС из метода os_string. Итак, я просто инициализировал объект и создал переменную для хранения возвращаемого значения.

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

print "$user_agent $os_name\n";

есть некоторые пользовательские агенты, которые не являются пользовательскими агентами браузера, поэтому они не получат никакого значения от os_string. Я получаю сообщение об ошибке Use of uninitialized value $os_name in concatenation (.) or string

Как мне обрабатывать такие случаи, когда $os_name не инициализирован, потому что метод os_string возвращает undef (это то, что я думаю, происходит при чтении исходного кода модуля). Я думаю, должен быть способ указать строку по умолчанию, например. В этих случаях нет ОС.


person sfactor    schedule 18.10.2010    source источник


Ответы (3)


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

Если $ua->os_string() ложно (то есть: undef, ноль или пустая строка), то будет оцениваться вторая часть выражения || (и будет значением выражения).

person cHao    schedule 18.10.2010

Обратите внимание: подход исходного ответа ( $var = EXPRESSION || $default_value ) будет давать значение по умолчанию для ЛЮБЫХ «ложных значений Perl», возвращаемых из выражения, например. если выражение представляет собой пустую строку, вместо этого вы будете использовать значение по умолчанию.

В вашем конкретном примере это, вероятно, правильно (имя ОС не должно быть пустой строкой), но в общем случае это может быть ошибка, если вы действительно хотели использовать только значение по умолчанию вместо undef.

Если вы хотите избегать только undef значений, но не пустой строки или нулей, вы можете сделать следующее:

  • Perl 5.10 и более поздние версии: используйте «оператор «или» (//):

    my $os_name = $ua->os_string() // 'No OS';
    
  • Perl 5.8 и более ранние версии: используйте условный оператор, потому что определение или еще не было доступно:

    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';
    

Более подробный обзор темы (включая подробности о //) можно найти в сообщении Брайана Д. Фоя здесь: http://www.efficientperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/

person DVK    schedule 18.10.2010
comment
Недавно я внес ошибку в свой код, используя подход ||. Нашел проблему до этого поста, но не знал об операторе «определенный или». Узнавайте что-то новое с Perl каждый день. - person ThisSuitIsBlackNot; 08.07.2013

Вы ищете defined?

person dvhh    schedule 18.10.2010