这个带有一元加号的 Perl 片段有什么作用?join( '/', 拼接 @t, 0, +@d )

sno*_*yjc 6 python arrays perl unary-operator

这个带有一元加号的 Perl 片段有什么作用?

join( '/', splice @t, 0, +@d )
Run Code Online (Sandbox Code Playgroud)

这是来自 File::Path.pm 第 267 行,我正在尝试理解它。根据文档,一元加什么也不做。另外 splice 的第三个参数是一个整数,而不是一个数组。这实际上做了吗scalar(@d)?感谢您的帮助。我正在尝试使用Pythonizer将此代码翻译为 python。

我尝试使用 -MO=Deparse ,它所做的就是吃掉+并移动括号:

join '/', splice(@t, 0, @d);
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 6

在这里完全+没用。


作者可能认为+@d是 的简短版本scalar(@d),但如果是这样,他们就错了。

一元 -+对上下文没有影响。[1]一元-+根本没有效果。引用普洛普的话,

一元"+"没有任何影响,即使对字符串也是如此。在语法上,它对于将函数名与带括号的表达式分开非常有用,否则该表达式将被解释为函数参数的完整列表。(请参阅上面“术语和列表运算符(左侧)”下的示例。)

它可以用来消除不明确的语法之间的歧义,[2]但它在上面的代码片段中甚至没有这样做。这是完全多余的。[3]

也就是说,这里@d 在标量上下文中求值的,但这是因为splice运算符将标量上下文强加于其第三个操作数。[4]它与一元- 无关+

因此,另一种可能性是作者想表明这里有一些不寻常的东西@d。人们可能会期望它在列表上下文中进行评估,其+目的是让读者停下来思考。

但是,我不建议这样做。+@d我不会使用误导性的 来0+@d实现这个目标。0+@d实际上强加了标量上下文,因此它表明正在@d标量上下文中进行评估,并且这样做不会产生误导。


  1. 下面演示了 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 请参阅使用 unary-+来消除歧义

  3. 下面演示了使用和不使用一元- 生成的完全相同的代码+

    $ 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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 下面演示了在标量上下文中计算第三个操作数:

    $ perl -Mv5.10 -e'say prototype( "CORE::splice" ) // "none/special"'
    \@;$$@
    
    Run Code Online (Sandbox Code Playgroud)


cho*_*oba 4

一元+有时有助于告诉解析器如何解释以下表达式。参见佩洛普

一元+没有任何影响,即使对字符串也是如此。在语法上,它对于将函数名与带括号的表达式分开非常有用,否则该表达式将被解释为函数参数的完整列表。

但在这种特殊情况下,它什么也不做,因为 被@d解析为splice的第三个参数。也许作者希望它在标量上下文中进行评估,但无论+.