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,零或空字符串),那么||表达式的第二部分将被评估(并且将是表达式的值).