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

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

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

print "$user_agent $os_namen";

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

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

3 ответов


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

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


обратите внимание: подход оригинального ответа ($var = EXPRESSION || $default_value) создаст значение по умолчанию для любых "Perl false values", возвращаемых из выражения, например, если выражение является пустой строкой, вы будете использовать значение по умолчанию.

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

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

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

    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.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/


ищите defined?