2013-10-14 2 views
8

Я просматриваю предлагаемый пакет, поставляемый поставщиками, в инструмент Perl, который мы используем, и я изо всех сил пытаюсь определить причину определенного типа изменений - предварительный запрос «@» на параметры, переданные подпрограмме.В чем смысл двойной 'at' (@@) в Perl?

Например, линия, которая была:

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 находятся в репозиториях, которые являются резервными копиями дисков для людей.) – ikegami

+0

Спасибо @Keith! Просмотр некоторых из «, v» историй для существующих файлов показывает тот же синтаксис. Патч применяется через некоторые встроенные обманки, которые, как я ожидал, означают передачу его в RCS/CVS в виде патча или новой версии, соскабливая экранирование. – thisismyrobot

+2

@thisismyrobot: Если файлы предназначены для внутренних файлов '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' из RCS или CVS. –