2013-10-14 46 views
8

我正在审查一个供应商提供的补丁程序给我们使用的Perl工具,并且我正在努力确定特定类型更改的原因 - 传递给子例程的参数的“@”的预先挂起。Perl中'at'(@@)的含义是什么?

举例来说,这是一个行:

my ($genfd) = @_; 

现在是:

my ($genfd) = @@_; 

并非是一个Perl的开发者,我在学习上到这里,但到目前为止,我understand that '@_'是提供给封装子程序的参数。

I also understand上面的赋值(其中'$ genfd'用左括号括起来)将'@_'转换为列表,然后将'genfd'标量变量赋值给该列表的第一个元素。这应该导致子程序的第一个参数被存储在'genfd'中。

我完全坚持的是第二个'@'的差异。我有found examples of this usage on GitHub,但从来没有解释过,也没有找到任何Perl引用或SO的解释。任何帮助将非常感激。

回答

18

看起来像一个坏的补丁。

@@_是一个语法错误。至少,当我有下面的Perl源文件:

#!/usr/bin/perl 

use strict; 
use warnings; 

sub foo { 
    my ($genfd) = @@_; 
} 

上运行它perl -cw(用Perl 5.14.2)给出:

Bareword found where operator expected at tmp.pl line 7, near "@@_" 
     (Missing operator before _?) 
syntax error at tmp.pl line 7, near "@@_" 
tmp.pl had compilation errors. 

我没有看过在GitHub上的所有实例,但其中许多文件的后缀为,v。 RCS和CVS使用该后缀作为其内部版本控制文件。我认为@这个字符有一些特殊的含义,所以它加倍表示字符@。 (是的,将RCS或CVS内部文件放在Git存储库中有点奇怪。)

某些类型的RCS或CVS交互是错误的最可能的解释,但可能还有其他原因。

你应该问问提供补丁的人。

+0

(大部分v文件出现在repos中,是人们驱动器的备份。) – ikegami

+0

谢谢@Keith!查看现有文件的一些',v'历史记录显示相同的语法。这个补丁是通过一些内置的技巧来实现的,我希望这个技巧可以将它作为补丁或新版本传递给RCS/CVS,并在逃跑时将其转移。 – thisismyrobot

+2

@thisismyrobot:如果这些文件是RCS或CVS内部的''v'文件,那么'@@ _'完全有效 - 当你检查文件时你会得到正确的Perl'@ _'脱离RCS或CVS。 –