2013-05-16 13 views
6

Jeśli używasz use strict i use warning i , jeśli podam typ danych my, to działa; jeśli nie podam wartości my, oznacza to błąd.zamieszanie z moją zmienną w perlu

use strict; 
use warnings; 
my $test=10; 
my @arr=(10,20,30); 

Gdybym zadeklarować nazwę zmiennej tablicy jako numer:

use strict; 
use warnings; 
my @100=(10,20,30); 

wtedy, gdy uruchomię ten program to mówi o błędzie:

Can't use global @100 in "my" at number_sclar.pl line 28, near "my @100" 

Jeśli usunąć że my i metę Program działa bezbłędnie.

Proszę, proszę, niech ktoś mi powie, dlaczego zmienna my nie jest obsługiwana przez numeryczną nazwę zmiennej tablicowej?

+0

Chcę poznać zasadę działania mojej zmiennej .. dlatego tutaj zamieściłem. – vara

+0

Cóż, nie mam dobrego wytłumaczenia; Zaryzykuję przypuszczenie, że jest ono przewidziane dla kompatybilności wstecznej, zgodnej ze specjalnymi zmiennymi, takimi jak '$^W'. FYI: możesz użyć 'our @ 100 = (10, 20, 30);' i 'print $ 100 [0];' bez wywoływania błędu. Kombinacja ostrzeżeń i "moje" oznacza, że ​​nazwy liczbowe są niedopuszczalne. –

+1

hmm. nigdy nie myślałem, że to zadziała. – OneSolitaryNoob

Odpowiedz

3

Jako niezamierzonym efektem ubocznym tworzenia $ 1, $ 2, $ 3 100 $, itp (do przechowywania wyników regex przechwytywania); @ 1, @ 2, @ 3, @ 100, itp. Również zostają utworzone.

Jednak nazwy tych i większości specjalnych znaków w perlvar nie są legalnymi nazwami, z wyjątkiem vars pakietów. Na przykład nie można wykonać my $(; ani sub (;, mimo że $( jest poprawną nazwą zmiennej pakietowej [1].

Gdy leksysy zostały dodane do Perla w 5.6, z pewnością uznano, że wprowadzenie takich nazw dla zmiennych użytkownika jest mylące. Prawdę mówiąc, wątpię, by ktoś nawet zabawiał tę myśl.

Sigil bok Zmienna ta leksykalne musi zaczynać się od postaci z [a-zA-Z_] [2] i mogą być stosowane przez wielu znaków z [a-za-z0-9_ ] [2]. W związku z tym @100 nie jest prawidłową nazwą zmiennej leksykalnej.


Uwagi:

  1. >perl -e"our $(;" 
    
    >perl -e"my $(;" 
    Can't use global $(in "my" at -e line 1, near "my $(" 
    Execution of -e aborted due to compilation errors. 
    
    >perl -e"sub (;" 
    Prototype not terminated at -e line 1. 
    
  2. Więcej punkty kodowe są rzeczywiście dozwolone, ale nie wchodzą one z zestawu znaków ASCII jest. Dla uproszczenia, wylistowałem tylko punkty kodu, które wchodzą w skład zestawu znaków ASCII.

+0

Myślałem, że to tylko 1 $ - 9 – jozefg

+0

@jozefg, To nie jest tak, jak mógłbyś sprawdzić za pomocą testu. – ikegami

9

Od perldoc perlvar:

Perl identifiers that begin with digits, control characters, or punctuation characters are exempt from the effects of the "package" declaration and are always forced to be in package "main"; they are also exempt from "strict 'vars'" errors. A few other names are also exempt in these ways...

+1

wow. rtfm ponownie uderza :) – OneSolitaryNoob

+0

Skąd to się wzięło 10 głosów? Nawet nie próbuje odpowiedzieć na pytanie OP! Fakt, że zmienne pakietowe istnieją z tymi nazwami, nie ma nic wspólnego z niemożnością zadeklarowania ich za pomocą 'my'. na przykład'$ a' i' $ _' są zwolnione z ograniczeń, ale mogą być zadeklarowane za pomocą 'my'. – ikegami