Как установить значение по умолчанию для переменной 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/