Jakie jest znaczenie @_
w Perlu?
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.
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 .
źródło
perlcritic
, osobiście uważam, że jest to najlepsze dla funkcji, ale dla metody jest przydatne doshift
samodzielnego odniesienia się, a następnie rozpakuj@_
tablicę. To wyjaśnia, że jest to metoda ORAZ metoda przyjmuje określone parametryPierwsze trafienie w wyszukiwaniu
perl @_
mówi tak :Ma również dłuższe i bardziej szczegółowe wyjaśnienie tego samego.
źródło
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.
źródło
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.
źródło
Wszystkie "zmienne specjalne" Perla są wymienione na stronie dokumentacji Perlvara .
źródło
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
$str
i ustawienie tablicy@_
.źródło
@
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.źródło
use strict
. Dlatego zredagowałem twoją podfunkcję.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.
źródło