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

sfa*_*tor 13 perl initialization perl-module object

我是Perl的新手.我需要使用外部模块HTTP :: BrowserDetect.我正在测试一些代码,并试图从os_string方法获取操作系统的名称.所以,我只是初始化了对象并创建了一个变量来存储返回的值.

my $ua = HTTP::BrowserDetect->new($user_agent);
my $os_name = $ua->os_string();

print "$user_agent $os_name\n";
Run Code Online (Sandbox Code Playgroud)

有一些用户代理不是浏览器用户代理,因此他们不会从os_string获取任何值.我收到了一个错误Use of uninitialized value $os_name in concatenation (.) or string

当$ os_name未初始化时如何处理这种情况,因为方法os_string返回undef(这是我认为通过阅读模块源代码发生的事情).我想应该有一种方法来提供默认字符串,例如在这些情况下没有操作系统.

DVK*_*DVK 28

请注意:原始答案的方法($var = EXPRESSION || $default_value)将为表达式返回的任何"Perl false值"生成默认值,例如,如果表达式为空字符串,则将使用默认值.

在您的特定示例中,它可能是正确的事情(操作系统名称不应该是空字符串),但在一般情况下,它可能是一个错误,如果您真正想要的只是使用默认值而不是undef.

如果您只想避免使用undef,而不是空字符串或零,则可以执行以下操作:

  • Perl 5.10及更高版本:使用"defined-or operator"(//):

    my $os_name = $ua->os_string() // 'No OS';
    
    Run Code Online (Sandbox Code Playgroud)
  • 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';
    
    Run Code Online (Sandbox Code Playgroud)

更深入地了解该主题(包括详细信息//)在brian d foy的帖子中:http://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or -运算符/


cHa*_*Hao 18

my $os_name = $ua->os_string() || 'No OS';
Run Code Online (Sandbox Code Playgroud)

如果$ua->os_string()是假的(即:undef,零或空字符串),那么||表达式的第二部分将被评估(并且将是表达式的值).