我是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(这是我认为通过阅读模块源代码发生的事情)。我想应该有办法给出一个默认字符串,例如在这些情况下没有操作系统。
答案 0 :(得分:28)
请注意:原始答案的方法($var = EXPRESSION || $default_value
)将为表达式返回的任何“Perl false值”生成默认值,例如:如果表达式是空字符串,则将使用默认值。
在您的特定示例中,它可能是正确的事情(操作系统名称不应该是空字符串),但在一般情况下,它可能是一个错误,如果您真正想要的只是使用默认值而不是undef
。
如果只想避免undef
值,而不是空字符串或零,则可以执行以下操作:
Perl 5.10及更高版本:使用“defined-or operator”(//
):
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';
更深入地了解该主题(包括有关//
的详细信息),请参阅brian d foy的帖子:http://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/
答案 1 :(得分:18)
my $os_name = $ua->os_string() || 'No OS';
如果$ua->os_string()
是假的(即:undef
,零或空字符串),那么||
表达式的第二部分将被评估(并且将是表达)。
答案 2 :(得分:1)
您在寻找defined
吗?