2013-10-14 14 views
8

Przeglądam proponowaną łatkę dostarczoną przez dostawcę do narzędzia Perla, którego używamy, i staram się zidentyfikować przyczynę określonego rodzaju zmiany - oczekiwanie na "@" do parametrów przekazanych do podprogramu.Jakie jest znaczenie podwójnego "at" (@@) w Perlu?

Na przykład, linia, która brzmiała:

my ($genfd) = @_; 

Czy teraz:

my ($genfd) = @@_; 

Nie będąc programistą Perl, uczę się na iść tutaj, ale do tej pory jest understand that '@_' parametry dostarczone do załączonego podprogramu.

I also understand powyższe przypisanie (gdzie '$ genfd' jest zawijany w nawiasy po lewej stronie) rzuca '@_' na listę, a następnie przypisuje zmienną skalarną 'genfd' do pierwszego elementu tej listy . Powinno to spowodować, że pierwszy parametr podprogramu będzie przechowywany w "genfd".

To, na czym się całkowicie utknąłem, to różnica, jaką powoduje drugie "@". Mam found examples of this usage on GitHub, ale nigdy z wyjaśnieniem, ani nie mogę znaleźć wyjaśnienia na żadnych odniesień Perl lub SO. Każda pomoc byłaby bardzo cenna.

Odpowiedz

18

Wygląda na pasku.

@@_ jest błędem składni. Przynajmniej kiedy mam następujący Perl plik źródłowy:

#!/usr/bin/perl 

use strict; 
use warnings; 

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

działa perl -cw na nim (z Perl 5.14.2) daje:

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. 

Nie spojrzał na wszystkich przykładach na GitHub , ale wiele z nich znajduje się w plikach z przyrostkiem ,v. Sufiks ten jest używany przez RCS i CVS do wewnętrznych plików kontroli wersji. Myślę, że znak @ ma pewne specjalne znaczenie, więc jest podwojony, aby wskazać literalną postać: @. (Tak, to trochę dziwne, że masz wewnętrzne pliki RCS lub CVS w repozytorium Git.)

Jakiś rodzaj interakcji RCS lub CVS jest najbardziej prawdopodobnym wyjaśnieniem błędu, ale mogą istnieć inne przyczyny.

Powinieneś zapytać osobę, która dostarczyła łatkę.

+0

(Większość plików v pojawia się w repozytoriach będących kopiami zapasowymi dysków użytkowników.) – ikegami

+0

Dziękuję @Keith! Przeglądanie niektórych historii ", v" dla istniejących plików przedstawia tę samą składnię. Łatka jest nakładana za pomocą jakiegoś wbudowanego oszustwa, które oczekiwałbym oznacza przekazanie go do RCS/CVS jako łatki lub nowej wersji, zdrapując ucieczkę, jak to się dzieje. – thisismyrobot

+2

@thisismyrobot: jeśli pliki mają być wewnętrznymi plikami RCS lub CVS '' v', to jest ono całkowicie poprawne - a otrzymasz poprawny Perl '@ _' podczas sprawdzania pliku z RCS lub CVS. –