曲径通幽论坛

标题: "定义否"操作符(//) [打印本页]

作者: beyes    时间: 2011-10-10 10:11
标题: "定义否"操作符(//)
“定义否” 操作符 // 的格式为 (值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 // ''; 即可。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2