Jakie jest znaczenie @_ w Perlu?

90

Jakie jest znaczenie @_w Perlu?

Andrei
źródło

Odpowiedzi:

119

perldoc perlvar jest pierwszym miejscem, w którym należy sprawdzić informacje o zmiennej Perl o specjalnej nazwie.

Cytowanie:

@_: W ramach podprogramu tablica @_zawiera parametry przekazane do tego podprogramu.

Więcej szczegółów można znaleźć w perldoc perlsub (podprogramy Perla), do których link znajduje się w perlvar :

Wszelkie przekazane argumenty pojawiają się w tablicy @_.

Dlatego jeśli wywołasz funkcję z dwoma argumentami, zostaną one zapisane w $_[0]i $_[1].

Tablica @_jest tablicą lokalną , ale jej elementy są aliasami rzeczywistych parametrów skalarnych . W szczególności, jeśli element $ _ [0] jest aktualizowany, aktualizowany jest odpowiadający mu argument (lub błąd występuje, jeśli nie można go zaktualizować).

Jeśli argument jest tablicą lub elementem haszującym, który nie istniał w momencie wywołania funkcji, element ten jest tworzony tylko wtedy, gdy (i jeśli) jest modyfikowany lub pobierane jest odwołanie do niego. (Niektóre wcześniejsze wersje Perla tworzyły element niezależnie od tego, czy element był przypisany, czy nie). Przypisanie do całej tablicy @_ usuwa aliasy i nie aktualizuje żadnych argumentów.

DVK
źródło
Dzięki, dopiero niedawno przyzwyczaiłem się do sprawdzania perldoc i okazało się, że strony internetowe są przydatne: perldoc.perl.org/perlvar.html Nie było źle stworzyć stub dla perla, który uruchamia to w sieci ... formatowanie strony internetowej bardzo mi pomaga.
aschultz
27

Zwykle parametry przekazywane do podrzędnego rozszerzasz za pomocą @_zmiennej:

sub test{
  my ($a, $b, $c) = @_;
  ...
}

# call the test sub with the parameters
test('alice', 'bob', 'charlie');

W ten sposób perlcritic twierdzi, że jest poprawny .

eckes
źródło
2
to jest jeden raz, z którym się nie zgadzam perlcritic, osobiście uważam, że jest to najlepsze dla funkcji, ale dla metody jest przydatne do shiftsamodzielnego odniesienia się, a następnie rozpakuj @_tablicę. To wyjaśnia, że ​​jest to metoda ORAZ metoda przyjmuje określone parametry
Joel Berger
Prawdopodobnie powinienem był wcześniej użyć / wiedzieć o PERLCritic, ale tego nie zrobiłem. Dziękujemy za użycie go w tym przykładzie. Czasami rzeczy, do których odwołujesz się z ręki, mogą pomóc komuś nauczyć się czegoś zupełnie nowego.
aschultz
12

Pierwsze trafienie w wyszukiwaniuperl @_ mówi tak :

@_ to lista parametrów przychodzących do sub.

Ma również dłuższe i bardziej szczegółowe wyjaśnienie tego samego.

Piskvor opuścił budynek
źródło
3
Właściwie pierwsze trafienie w wyszukiwarce Google prowadzi teraz do tej właśnie strony.
Gabriel Southern
... siedem lat później, wieczność w czasie internetu. Dlatego zarówno połączyłem się z pierwszym wynikiem, jak i zapytałem o odpowiednią część: poleganie tylko na Google byłoby bardzo naiwne.
Piskvor opuścił budynek
1
To prawda, że ​​minęło wiele lat, ale nadal irytujące jest przeczytanie odpowiedzi, która sugeruje, że powinieneś Google, aby uzyskać odpowiedź na pytanie. To bezcelowa informacja dla kogoś czytającego odpowiedź w wyniku wyszukiwania w Google.
Gabriel Southern
2
Tak, wyszukiwanie jest właściwym pierwszym krokiem, ale nie jest konieczne dołączanie instrukcji wyszukiwania do odpowiedzi. To zbędne informacje, które nie dodają żadnej wartości i jest to ironiczne, ponieważ jeśli ktoś podąży za linkiem wyszukiwania w Twojej odpowiedzi, przeniesie go z powrotem tam, gdzie zaczął.
Gabriel Southern
1
wszystkie te odpowiedzi typu „google it” bardzo się postarzały 😂
Austin Adams,
11

Pytanie brzmiało, co @_ oznacza w Perlu. Odpowiedź na to pytanie jest taka, że ​​o ile w Perlu $_oznacza to@_ podobnie, oznacza to, że oni .

Wydaje się, że nikt nie wspomniał o tym krytycznym aspekcie jego znaczenia - podobnie jak ich .

W konsekwencji oba są używane jako zaimki, a czasem jako tematizatory.

Zwykle mają nominalnych poprzedników, chociaż nie zawsze.

tchrist
źródło
7

W większości przypadków możesz również użyć shift dla poszczególnych zmiennych:

$var1 = shift;

Jest to temat, w którym należy dokładniej zbadać, ponieważ Perl ma wiele interesujących sposobów uzyskiwania dostępu do zewnętrznych informacji w ramach podprogramu.

hockfan86
źródło
3
Fajnie, ktokolwiek dał mi głos negatywny po prostu za opublikowanie innego sposobu, aby zrobić podobną rzecz. Zdaję sobie sprawę, że nie odpowiedziałem bezpośrednio na pytanie, ponieważ ktoś już to zrobił, ale zaproponowałem alternatywną formę, przez którą nowi programiści Perla są często zdezorientowani.
hockfan86
5

Wszystkie "zmienne specjalne" Perla są wymienione na stronie dokumentacji Perlvara .

aschepler
źródło
2

Również jeśli funkcja zwraca tablicę, ale funkcja jest wywoływana bez przypisywania jej zwróconych danych do żadnej zmiennej, jak poniżej. Tutaj wywoływana jest funkcja split (), ale nie jest ona przypisana do żadnej zmiennej. Możemy później uzyskać dostęp do zwróconych przez niego danych poprzez @_:

$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);

print @_[0]; # 'Mr.Bond'

Spowoduje to podzielenie ciągu $stri ustawienie tablicy @_.

Afser2000
źródło
1

@ jest używany dla tablicy.

W podprogramie lub kiedy wywołujesz funkcję w Perlu, możesz przekazać listę parametrów. W takim przypadku @_można użyć is do przekazania listy parametrów do funkcji:

sub Average{

    # Get total number of arguments passed.
    $n = scalar(@_);
    $sum = 0;

    foreach $item (@_){

        # foreach is like for loop... It will access every
        # array element by an iterator
        $sum += $item;
    }

    $average = $sum / $n;

    print "Average for the given numbers: $average\n";
}

Wywołanie funkcji

Average(10, 20, 30);

Jeśli obserwujesz powyższy kod, zobacz foreach $item(@_)wiersz ... Tutaj przekazuje parametr wejściowy.

Omar Faroque Anik
źródło
Powinieneś zawsze use strict. Dlatego zredagowałem twoją podfunkcję.
EverythingRightPlace
0

Nigdy nie próbuj edytować zmiennej @_ !!!! Nie wolno ich dotykać .. Albo uzyskasz niespodziewany efekt. Na przykład...

my $size=1234;
sub sub1{
  $_[0]=500;
}
sub1 $size;

Przed wywołaniem rozmiar sub1 $ zawiera 1234. Ale po 500 (!!) Więc nie edytuj tej wartości !!! Możesz przekazać dwie lub więcej wartości i zmienić je w podprogramie, a wszystkie zostaną zmienione! Nigdy nie widziałem opisanego efektu. Programy, które widziałem, również pozostawiają @_ array tylko do odczytu. I tyle tylko, że możesz bezpiecznie przekazać zmienną nie zmieniaj wewnętrznego podprogramu Zawsze musisz to robić:

sub sub2{
  my @m=@_;
  ....
}

przypisać @_ do lokalnych zmiennych procedur podprogramu, a następnie pracować z nimi. Również w niektórych głęboko rekurencyjnych algorytmach, które zwracają tablicę, możesz użyć tego podejścia do zmniejszenia pamięci używanej dla lokalnych zmiennych. Tylko jeśli zwróć tablicę @_ tak samo.

Anatolij
źródło