我该如何为Perl变量设置默认值?

15

我完全不懂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(这是我从阅读模块源代码中得出的结论)。我猜应该有一种方式在这些情况下提供默认字符串,例如"No OS"。

3个回答

32
请注意:原回答中的方法($var = EXPRESSION || $default_value)将会对从表达式返回的任何“Perl false values”使用默认值,例如,如果表达式是空字符串,你将会使用默认值。
在你的特定例子中,这可能是正确的做法(操作系统名称不应该是空字符串),但一般情况下,如果你实际上想要的是仅使用默认值而不是undef,那么这可能是一个错误。
如果你只想避免undef值,而不是空字符串或零,你可以这样做:
- Perl 5.10及更高版本:使用“defined-or operator”(//):
my $os_name = $ua->os_string() // 'No OS';
Perl 5.8及更早版本:使用条件运算符,因为此时未出现defined-or运算符:
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';
更深入地了解此主题(包括有关//的详细信息)的文章在brian d foy的这篇帖子中: http://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/

1
最近我在代码中使用了 || 方法引入了一个 bug。在发布这篇文章之前发现了这个问题,但不知道 "defined-or" 运算符。每天都能从 Perl 中学到新东西。 - ThisSuitIsBlackNot

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

如果$ua->os_string()为假值(即undef,零或空字符串),则将评估||表达式的第二部分,并且该值将成为表达式的值。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接