“定义否” 操作符 // 的格式为 (值1) // (值2) 。如在一个赋值操作中,当 值1 为真时,取 值1 ;否则,取操作符右边的 值2 。它类似与 C 语言中的 ifdef ...else 这样的表达方式。比较下面的例子:
比如程序里通常会根据 VERBOSE 环境变量来决定是否打印出详细信息,在 Perl 中,我们可以通过检查 %ENV 中的 VERBOSE 键是否有值,如果没有,我们可以对它赋值:
[Perl] 纯文本查看 复制代码 #!/usr/bin/perl
use 5.010;
my $Verbose = $ENV{VERBOSE};
print "I can talk to you!\n" if $Verbose;
由于 VERBOSE 没有定义,所以这里无法输出 "I can talk to you" 这句话。这时,我们使用 // 操作符处理这种情况,将上面修改成:
[Perl] 纯文本查看 复制代码 #!/usr/bin/perl
use 5.010;
my $Verbose = $ENV{VERBOSE} // 1;
print "I can talk to you!\n" if $Verbose;
运行输出:# ./false.pl
I can talk to you! 这是因为,在我们发现 VERBOSE 没有值时,我们就给变量 $Verbose 赋值 1 ;否则就直接使用 VERBOSE 的值。
下面还有一个例子:
[Perl] 纯文本查看 复制代码 #!/usr/bin/perl
use 5.010;
foreach $try (0, undef, '0', 1, 25) {
print "Trying [$try] ---> ";
my $value = $try // 'default';
say "\tgot [$value]";
}
运行输出:# ./false.pl
Trying [0] ---> got [0]
Trying [] ---> got [default]
Trying [0] ---> got [0]
Trying [1] ---> got [1]
Trying [25] ---> got [25] 上面,使用 foreach 把列表中的值依次给 $try 赋值,在 $try 为 undef 时,我们仍然为 $value 赋值 "default",而不是为 undef 。
另外,当我们在程序中使用了 use warnings 语句后,如果程序中输出未定义的变量,那么在程序运行时会发出警告,如:
[code=perl]#!/usr/bin/perl
use 5.010;
use warnings;
my $name;
printf "%s", $name;[/mw_shl_code]
运行输出:# ./false.pl
Use of uninitialized value $name in printf at ./false.pl line 7. 尽管这种错误并无大碍,但可以用 // 操作符给未定义的变量赋值一个空串,这样就避免运行时发出警告,此时可以将上面的 printf 改为:printf "%s", $name // ''; 即可。 |