2013-06-18 10 views
8

Miałem małe pytanie. Czytałem kod i ponieważ moja szkoła nie nauczyła mnie niczego przydatnego w programowaniu perl, jestem tutaj, aby zapytać was o ludzi. Widzę to linia używany dużo w niektórych programach Perla:Perl używając specjalnego znaku &

$variable = &something(); 

Nie wiem, co oznacza znak & tutaj jak nigdy mówię to w Perlu. I something jest podprocedurą (zgaduję). Zwykle mówi on o nazwie i czasami ma argumenty podobne do funkcji. Czy ktoś może mi powiedzieć, co znaczy & tutaj i co to jest 0123,przez cały czas.

Zmienna przyjmuje jakąś zwróconą wartość, a następnie służy do sprawdzenia pewnych warunków, co powoduje, że myślę, że jest to podprogram. Ale wciąż dlaczego &?

Dzięki

Odpowiedz

14

w starszych wersjach Perl & użyto zadzwonić podprogramów. Teraz nie jest to konieczne i \& jest stosowany głównie do podjęcia reference do podprogramu,

my $sub_ref = \&subroutine; 

lub zignorować prototyp funkcji (http://perldoc.perl.org/perlsub.html#Prototypes)

Inne niż do odwołujących podprogramów & jest bitwise and operator,

http://perldoc.perl.org/perlop.html#Bitwise-And

+0

oh więc jeśli zmienię go bez znaku &, to nadal działa? – ban

+1

tak, nadal by działało. –

+0

w porządku. Więc nie jestem w stanie znaleźć funkcji, na którą wskazuje. Musi być w innym pliku. Ale czy możesz mi powiedzieć, jak wywoływali funkcję z innego pliku bez użycia pakietu: package :: sub() – ban

27

Praktycznie za każdym razem, gdy widzisz & poza \&foo i EXRP && EXPR, jest to błąd.


  • &foo(...) jest taka sama jak foo(...) oprócz prototypu foo „s zostanie zignorowany.

    sub foo(&@) { ... }  # Cause foo to takes a BLOCK as its first arg 
    
    foo { ... } ...; 
    &foo(sub { ... }, ...); # Same thing. 
    

    Tylko podprogramy (nie operatorzy) będą wywoływane przez &foo(...).

    sub print { ... } 
    print(...);   # Calls the print builtin 
    &print(...);  # Calls the print sub. 
    

    Prawdopodobnie nigdy nie będziesz potrzebować korzystać z tej funkcji w całej karierze programistycznej. Jeśli widzisz, że jest używany, to na pewno ktoś używający &, gdy nie powinien.

  • &foo jest podobna do &foo(@_). Różnica polega na tym, że zmiany na @_ w foo wpływają na bieżące sub-@_.

    Prawdopodobnie nigdy nie będziesz potrzebować korzystać z tej funkcji w całej karierze programistycznej. Jeśli widzisz, że jest używany, to na pewno ktoś używający &, kiedy nie powinien, lub głupia próba optymalizacji. Jednak, co następuje dość elegancki:

    sub log_info { unshift @_, 'info'; &log } 
    sub log_warn { unshift @_, 'warn'; &log } 
    sub log_error { unshift @_, 'error'; &log } 
    
  • goto &foo jest podobna do &foo, z wyjątkiem prądu podprogram usuwa ze stosu najpierw zadzwonić. To spowoduje, że nie pojawi się na przykład w śladach stosu.

    Prawdopodobnie nigdy nie będziesz potrzebować korzystać z tej funkcji w całej karierze programistycznej. Jeśli widzisz, że jest używany, to z pewnością głupia próba optymalizacji.

    sub log_info { unshift @_, 'info'; goto &log; } # These are slower than 
    sub log_warn { unshift @_, 'warn'; goto &log; } # not using goto, but maybe 
    sub log_error { unshift @_, 'error'; goto &log; } # maybe log uses caller()? 
    
  • $& zawiera co dopasowane ostatni mecz regex wyrażenie. Przed 5.20 użycie tego powoduje, że każde wyrażenie regularne w całym tłumaczu staje się wolniejsze (jeśli nie ma żadnych przechwyceń), więc nie używaj tego.

    print $&  if /fo+/;  # Bad before 5.20 
    print $MATCH if /fo+/;  # Bad (Same thing. Requires "use English;") 
    print ${^MATCH} if /fo+/p; # Ok (Requires Perl 5.10) 
    print $1  if /(fo+)/; # Ok 
    
  • defined &foo jest w pełni uzasadnione sposobem na sprawdzenie, czy podprogram istnieje, ale nie jest to coś, co będzie prawdopodobnie potrzebować. Istnieje również exists &foo jest podobny, ale nie tak użyteczny.

  • EXPR & EXPR to bitowy operator AND. Jest to używane w przypadku systemów niskopoziomowych, które przechowują wiele informacji w jednym słowie.

    system($cmd); 
    die "Can't execute command: $!\n"  if $? == -1; 
    die "Child kill by ".($? & 0x7F)."\n" if $? & 0x7F; 
    die "Child exited with ".($? >> 8)."\n" if $? >> 8; 
    
  • &{ EXPR }() (i &$ref()) jest wywołanie podprogramu poprzez odniesienie. Jest to całkowicie akceptowalna i dość powszechna rzecz, choć wolę składnię $ref->(). Przykład w następnym punkcie.

  • \&foo przyjmuje odwołanie do podprocedury foo. Jest to całkowicie do przyjęcia i dość często do zrobienia.

    my %dispatch = (
        foo => \&foo, 
        bar => \&bar, 
    ); 
    
    my $handler = $dispatch{$cmd} or die; 
    $handler->(); 
    # Same: &{ $handler }(); 
    # Same: &$handler(); 
    
  • EXPR && EXPR jest logiczna i operatora. Jestem pewien, że znasz tego niezwykle popularnego operatora.

    if (0 <= $x && $x <= 100) { ... } 
    
+0

Zapomniałem o bitowym i boolowskim AND. Dodany. – ikegami

+0

dziękuję bardzo ... to było dużo informacji w jednej odpowiedzi – ban

+0

@ikegami ... nie zostawiaj nas! –

Powiązane problemy