曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3238|回复: 0
打印 上一主题 下一主题

"定义否"操作符(//)

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2011-10-10 10:11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
“定义否” 操作符 // 的格式为 (值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 // ''; 即可。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 23:43 , Processed in 0.083954 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表