8

我正在审查我们使用的 Perl 工具的提议的供应商提供的补丁,并且我正在努力确定特定类型更改的原因 - 将“@”前置到传递给子例程的参数中。

例如,一行是:

my ($genfd) = @_;

就是现在:

my ($genfd) = @@_;

我不是 Perl 开发人员,我在这里边走边学,但到目前为止,我知道“@_”是提供给封闭子例程的参数。

我也理解上面的赋值('$genfd' 包含在左侧的括号中)将'@_' 转换为列表,然后将'genfd' 标量变量分配给该列表的第一个元素。这应该导致子例程的第一个参数存储在“genfd”中。

我完全坚持的是第二个'@'有什么不同。我在 GitHub 上找到了这种用法的示例,但从来没有解释过,也找不到任何 Perl 参考或 SO 的解释。任何帮助将非常感激。

4

1 回答 1

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 使用该后缀作为其内部版本控制文件。我认为这个@字符有一些特殊的含义,所以它被加倍来表示一个字面@字符。(是的,在 Git 存储库中有 RCS 或 CVS 内部文件有点奇怪。)

某种 RCS 或 CVS 交互是该错误最可能的解释,但也可能有其他原因。

您应该询问提供补丁的人。

于 2013-10-14T03:35:32.230 回答