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(这是我认为阅读模块源代码时会发生的情况)。我想应该有一种方法可以提供默认字符串,例如在这些情况下没有操作系统。

4

3 回答 3

30

请注意:原始答案的方法 ( $var = EXPRESSION || $default_value) 将为从表达式返回的任何“Perl 错误值”生成默认值,例如,如果表达式是空字符串,您将使用默认值。

在您的特定示例中,这可能是正确的做法(操作系统名称不应为空字符串),但在一般情况下,如果您真正想要的是仅使用默认值而不是undef.

如果您只想避免undefvalues,而不是空字符串或零,您可以这样做:

  • 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';
    

//brian d foy 在此处的帖子中对该主题进行了更深入的了解(包括有关的详细信息): http ://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or -操作员/

于 2010-10-18T13:33:28.833 回答
21
my $os_name = $ua->os_string() || 'No OS';

如果$ua->os_string()是假的(即:undef、零或空字符串),则||表达式的第二部分将被计算(并且将是表达式的值)。

于 2010-10-18T12:26:16.230 回答
1

你在找defined吗?

于 2010-10-18T13:33:49.317 回答