什么是// = Perl?

Upl*_*and 28 perl

我找到了一些我需要的Perl代码的例子,但它有一些我无法识别的内容.

my $i //= '08';
Run Code Online (Sandbox Code Playgroud)

我在任何地方都找不到任何参考!它看起来像是:

my $i = '08';
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Jon*_*ler 52

//=操作符是赋值运算符的版本//"逻辑定义-或"运算符.

在一个的上下文my变量声明,变量最初未定义所以它等效于分配(和将被更好地写成my $i = '08';).但总的来说,

$i //= '08';
Run Code Online (Sandbox Code Playgroud)

是一个简写:

$i = (defined $i) ? $i : '08';
Run Code Online (Sandbox Code Playgroud)

它在Perl运算符(perldoc perlop)中记录在两个地方(简洁地在赋值运算符部分下面,并在"逻辑定义 - 或"部分中完整记录).它是在Perl 5.10.0中添加的.

  • @tecnotron:我在当前的Perl版本中提供了对运算符文档的引用.如果你正在使用Perl 5.8.x(或者,这个想法,那些旧的东西),那么它就不可用,因此没有记录.但它是在Perl 5.10.0中添加的,也可以在更高版本中使用. (8认同)
  • 非常感谢...直到今天,我似乎对这一生都一无所知.我第一次检查了骆驼书......然后谷歌......并没有发现任何东西.但现在我知道了......再次感谢 (2认同)

ike*_*ami 7

简短的回答:它是一样的my $i = '08';.


首先,我们来看看 $i //= '08';

EXPR1 //= EXPR2;
Run Code Online (Sandbox Code Playgroud)

是相同的

EXPR1 = EXPR1 // EXPR2;
Run Code Online (Sandbox Code Playgroud)

除了EXPR1仅评估一次.这是一种方便的写作方式

EXPR1 = EXPR2 if !defined(EXPR1);
Run Code Online (Sandbox Code Playgroud)

有关Perl运算符的文档,请参阅perlop.


回到my $i //= '08';.这意味着

my $i;
$i = '08' if !defined($i);
Run Code Online (Sandbox Code Playgroud)

$i总是未定义.写作会好得多

my $i = '08';
Run Code Online (Sandbox Code Playgroud)


yas*_*asu 6

它是"定义或"运算符.

$i //= '08';
Run Code Online (Sandbox Code Playgroud)

相当于:

$i = defined($i)? $i: '08';
Run Code Online (Sandbox Code Playgroud)

它是在Perl 5.10.0中引入的,旧版本不支持.

  • 这个问题发布为"什么是// = in perl?" (2认同)

cre*_*ive 5

$i //= '08'是一样的$i = defined($i) ? $i : '08'.它几乎相同$i ||= '08',转换为$i = $i ? $i : '08'.现在,当你声明你的变量时my,它被设置为undef.因此,它将始终遵循08分支.另外,如果您想知道,//操作员出现在Perl v5.10中; 所以它会在较旧的Perls上生成编译错误.