我是Perl的新手。我仍在尝试学习它的语法。我见过有人在Perl中使用//
和//=
,但我在网上找不到任何解释此内容的资源。
有人可以向我解释一下外行人的意思究竟是什么意思吗?它实际上做了什么?
答案 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)
逻辑定义 - 或
虽然它在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;
表单可用于设置可能尚未定义的变量的默认值。