在Perl中//和// =做什么?

时间:2013-08-07 01:16:58

标签: perl

我是Perl的新手。我仍在尝试学习它的语法。我见过有人在Perl中使用////=,但我在网上找不到任何解释此内容的资源。

有人可以向我解释一下外行人的意思究竟是什么意思吗?它实际上做了什么?

2 个答案:

答案 0 :(得分:7)

正如kjprice所提到的,//是逻辑'定义或'运算符和is documented here on the perlop page,相关的摘录是

  

它与||完全相同,只是它测试左手边的定义而不是真实。因此,EXPR1 // EXPR2返回EXPR1的值(如果已定义),否则返回EXPR2的值。

你可以想到

my $var = EXPR1 // EXPR2;

作为一种简短的写作方式:

my $var;
if ( defined EXPR1 ) {
    $var = EXPR1;
} else {
    $var = EXPR2;
}

我经常使用它来为变量分配默认值,除非提供了由命令行或配置文件提供的值。类似的东西:

my $var = $config_version // 'foo';

//=是一个变体,其中混合了一个assignemnt。同样的perlop页面说明了这一点:

  

修改作业等同于进行作业   修改分配给的变量。

对于//=而言,这意味着不是写

之类的东西
my $var = EXPR1 // EXPR2;

你可以写

my $var = EXPR1;
$var //= EXPR2;

并获得等效值。

答案 1 :(得分:2)

来自perldoc perlop

  

逻辑定义 - 或

     

虽然它在C中没有直接的等价物,但Perl的//运算符与它的C风格或。实际上,它与||完全相同,只是它测试左手边的定义而不是真实。因此,EXPR1 // EXPR2如果已定义则返回EXPR1的值,否则返回EXPR2的值。 (EXPR1在标量上下文中进行评估,在EXPR2本身的上下文中//进行评估。通常,这与defined(EXPR1) ? EXPR1 : EXPR2的结果相同(除了三元运算符形式可以用作左值,而EXPR1 // EXPR2不能)。这对于为变量提供默认值非常有用。如果您确实要测试是否定义了$a$b中的至少一个,请使用defined($a // $b)

所以:

 $NODEFINED // $DEFINED # will return the value of defined

 $DEFINED1 // $DEFINED2 # will return the value of $DEFINED1

 $a //= $b;

是:

的简写
 $a = $a // $b;

只有$a未定义时,才会将$b设置为值$a

$a //= 42;表单可用于设置可能尚未定义的变量的默认值。