Как я могу установить значение по умолчанию для переменной Perl? - PullRequest
13 голосов
/ 18 октября 2010

Я совершенно новичок в 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 (это то, что я думаю, происходит при чтении исходного кода модуля) Я предполагаю, что должен быть способ дать строку по умолчанию, например Нет ОС в этих случаях.

Ответы [ 3 ]

28 голосов
/ 18 октября 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.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/

18 голосов
/ 18 октября 2010
my $os_name = $ua->os_string() || 'No OS';

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

1 голос
/ 18 октября 2010

Вы ищете defined?

...