sno*_*yjc 6 python arrays perl unary-operator
这个带有一元加号的 Perl 片段有什么作用?
join( '/', splice @t, 0, +@d )
这是来自 File::Path.pm 第 267 行,我正在尝试理解它。根据文档,一元加什么也不做。另外 splice 的第三个参数是一个整数,而不是一个数组。这实际上做了吗scalar(@d)?感谢您的帮助。我正在尝试使用Pythonizer将此代码翻译为 python。
我尝试使用 -MO=Deparse ,它所做的就是吃掉+并移动括号:
join '/', splice(@t, 0, @d);
在这里完全+没用。
作者可能认为+@d是 的简短版本scalar(@d),但如果是这样,他们就错了。
一元 -+对上下文没有影响。[1]一元-+根本没有效果。引用普洛普的话,
一元
"+"没有任何影响,即使对字符串也是如此。在语法上,它对于将函数名与带括号的表达式分开非常有用,否则该表达式将被解释为函数参数的完整列表。(请参阅上面“术语和列表运算符(左侧)”下的示例。)
它可以用来消除不明确的语法之间的歧义,[2]但它在上面的代码片段中甚至没有这样做。这是完全多余的。[3]
也就是说,这里@d 是在标量上下文中求值的,但这是因为splice运算符将标量上下文强加于其第三个操作数。[4]它与一元- 无关+。
因此,另一种可能性是作者想表明这里有一些不寻常的东西@d。人们可能会期望它在列表上下文中进行评估,其+目的是让读者停下来思考。
但是,我不建议这样做。+@d我不会使用误导性的 来0+@d实现这个目标。0+@d实际上强加了标量上下文,因此它表明正在@d标量上下文中进行评估,并且这样做不会产生误导。
下面演示了 unary-+不影响上下文:
$ perl -Mv5.10 -e'
   my @a = qw( a b c );
   my $x_without =  @a;  say $x_without;
   my $x_with    = +@a;  say $x_with;
   my @y_without =  @a;  say @y_without;
   my @y_with    = +@a;  say @y_with;
'
3
3
abc
abc
请参阅使用 unary-+来消除歧义。
下面演示了使用和不使用一元- 生成的完全相同的代码+。
$ diff -u \
   <( perl -MO=Concise,-exec -e'join( '/', splice @t, 0, +@d )' 2>&1 ) \
   <( perl -MO=Concise,-exec -e'join( '/', splice @t, 0,  @d )' 2>&1 ) \
&& echo same
same
下面演示了在标量上下文中计算第三个操作数:
$ perl -Mv5.10 -e'say prototype( "CORE::splice" ) // "none/special"'
\@;$$@