【问题标题】:What is the meaning of the double 'at' (@@) in Perl?Perl 中的双 'at' (@@) 是什么意思?
【发布时间】:2013-10-21 14:20:38
【问题描述】:

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

例如,一行是:

my ($genfd) = @_;

现在:

my ($genfd) = @@_;

我不是 Perl 开发人员,我正在这里学习,但到目前为止,我 understand that '@_' 是提供给封闭子例程的参数。

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

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

【问题讨论】:

    标签: perl variables syntax


    【解决方案1】:

    看起来是个坏补丁。

    @@_ 是语法错误。至少,当我有以下 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 交互是该错误最可能的解释,但也可能有其他原因。

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

    【讨论】:

    • (大多数 ,v 文件出现在作为人们驱动器备份的存储库中。)
    • 谢谢@Keith!查看现有文件的一些 ',v' 历史记录显示相同的语法。该补丁是通过一些内置的技巧应用的,我认为这意味着将其作为补丁或新版本传递给 RCS/CVS,同时刮掉转义。
    • @thisismyrobot:如果文件是 RCS 或 CVS 内部的 ,v 文件,那么 @@_ 是完全有效的——当你从 RCS 或 CVS 中检查文件。
    猜你喜欢
    • 2015-06-13
    • 2018-03-05
    • 2017-02-27
    • 2010-12-28
    • 2023-03-25
    • 2020-05-21
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多