Wydaje mi się, że natknąłem się na kilka różnych sposobów, aby znaleźć rozmiar tablicy. Jaka jest różnica między tymi trzema metodami?
my @arr = (2);
print scalar @arr; # First way to print array size
print $#arr; # Second way to print array size
my $arrSize = @arr;
print $arrSize; # Third way to print array size
print 0+@arr
,print "".@arr
,print ~~@arr
"".@arr
ponieważ"@arr"
robi to coś zupełnie innego.Odpowiedzi:
Pierwszy i trzeci sposób są takie same: oceniają tablicę w kontekście skalarnym. Uznałbym to za standardowy sposób na uzyskanie rozmiaru tablicy.
Drugi sposób faktycznie zwraca ostatni indeks tablicy, który nie jest (zwykle) taki sam jak rozmiar tablicy.
źródło
$[
określa „Indeks pierwszego elementu w tablicy i pierwszego znaku w podciągu” (perldoc perlvar
). Domyślnie jest ustawiony na 0, a ustawienie go na wartość inną niż 0 jest wysoce odradzane.$[
jest odradzany (i był przez dekadę).$[
jest przestarzałe. Używanie$[
wydaje ostrzeżenie o wycofaniu, nawet jeśli nie włącza się ostrzeżeń. Przypisanie niczego innego niż zero$[
będzie błędem w 5.16. Czy możemy$[
już przestać o tym wspominać ?$[
wiedziałby o jego skutkach.scalar @arr
i nadal$#arr
powinien zrozumieć możliwe skutki , choć są rzadkie.$[
Po pierwsze, drugi nie jest równoważny dwóm pozostałym.
$#array
zwraca ostatni indeks tablicy, który jest o jeden mniejszy niż rozmiar tablicy.Pozostałe dwa są praktycznie takie same. Po prostu używasz dwóch różnych środków do stworzenia kontekstu skalarnego. Wszystko sprowadza się do kwestii czytelności.
Osobiście wolę następujące:
Uważam, że to jaśniejsze niż
i
Ten ostatni wygląda całkiem wyraźnie sam, ale uważam, że dodatkowa linia odbiera jasność, gdy jest częścią innego kodu. Jest to przydatne do nauczania tego, co
@array
robi w kontekście skalarnym, a może jeśli chcesz użyć$size
więcej niż raz.źródło
my $size=@array
wygląda na to, że błędem może być użycie niewłaściwej pieczęci.scalar
bez powodu, uczą się złej lekcji. Zaczynają myśleć, że operatorzy zwracają listy, które można przekształcić w skalary. Widziałem to dziesiątki razy.scalar
ponieważ wymuszasz listę w kontekście skalarnym. To jest właściwy powód, aby z niego korzystać. Twój przykład robi dokładnie to samo, ale opiera się na tym, co robi Perl, gdy oceniasz zmienną listy w niejawnie skalarnym kontekście. Zatem twój przykład wymaga od czytelnika wiedzy o domyślnym zachowaniu Perla w tym kontekście. Po prostu dodajesz do wyrażenia jeszcze jedną warstwę niejawnego zachowania, a Perl ma już zbyt wiele niejawnych zachowań, które musisz uzasadnić, aby rozszyfrować program.scalar
ponieważ zmuszasz listę do kontekstu skalarnego”, Udowadniasz mój punkt widzenia na temat wyciągania niewłaściwej lekcji. To jest całkowicie fałszywe. Żadna lista nigdy nie jest wymuszana przezscalar
. (Jeśli tak,scalar(@array)
iscalar(@array[0..$#array])
zwróci to samo.)scalar(@array)
Mówi@array
o zwróceniu skalara, z którym już powiedziałeś, aby to zrobićmy $size=
.Rozmiar uzyskuje się, zmuszając tablicę do kontekstu skalarnego, w którym jest ona oceniana jako jej rozmiar:
Jest to kolejny sposób na zmuszenie tablicy do kontekstu skalarnego, ponieważ jest ona przypisana do zmiennej skalarnej:
Pobiera indeks ostatniego elementu w tablicy, więc w rzeczywistości jest to rozmiar minus 1 (zakładając, że indeksy zaczynają się od 0, które można regulować w Perlu, chociaż jest to zwykle zły pomysł):
Ten ostatni nie jest zbyt dobry do uzyskania rozmiaru tablicy. Przydałoby się, jeśli chcesz tylko uzyskać ostatni element tablicy:
Ponadto, jak widać tutaj na przepełnieniu stosu, ta konstrukcja nie jest obsługiwana poprawnie przez większość wyróżników składni ...
źródło
$arr[-1]
aby uzyskać ostatni element. I$arr[-2]
dostać przedostatni, i tak dalej.$#arr
nie jest to bardzo przydatna funkcja i nieprzypadkowo inne języki jej nie mają.Aby użyć drugiego sposobu, dodaj 1:
źródło
for [0..$#array] { print $array[$_ ] }
działa naprawdę dobrze, jeśli celem uzyskania liczby elementów jest iteracja po tablicy. Zaletą jest to, że dostajesz element, a także licznik, które są wyrównane.Wszystkie trzy dają ten sam wynik, jeśli nieco zmodyfikujemy drugi:
źródło
Przykład:
źródło
Sekcja „Perl typy zmiennych” z dokumentacji perlintro zawiera
Dokumentacja perldata obejmuje to również w sekcji „Wartości skalarne” .
Wcześniej w tej samej sekcji opisano, jak uzyskać indeks ostatniego elementu tablicy.
źródło
Istnieją różne sposoby drukowania rozmiaru tablicy. Oto znaczenie wszystkich: Powiedzmy, że nasza tablica jest
my @arr = (3,4);
Metoda 1: skalar
To właściwy sposób na uzyskanie rozmiaru tablic.
Metoda 2: Numer indeksu
$#arr
daje ostatni indeks tablicy. więc jeśli tablica ma rozmiar 10, to jej ostatni indeks wynosiłby 9.Dodajemy tutaj 1, biorąc pod uwagę tablicę jako 0-indeksowaną . Ale jeśli nie jest to zero, logika się nie powiedzie .
Powyższy przykład drukuje 6, ponieważ ustawiliśmy jego początkowy indeks na 4. Teraz indeks będzie wynosił 5 i 6, odpowiednio z elementami 3 i 4.
Metoda 3:
Gdy tablica jest używana w kontekście skalarnym, zwraca rozmiar tablicy
W rzeczywistości metoda 3 i metoda 1 są takie same.
źródło
Z perldoc perldata , które powinno być bezpiecznie cytować:
Tak długo, jak nie będziesz # $ ++ i w tajemniczy sposób zwiększysz rozmiar lub swoją tablicę.
i
To prowadzi mnie do tego, czego szukałem, czyli do wykrycia, że tablica jest pusta. Znalazłem, jeśli $ # pusty == -1;
źródło
A
int(@array)
może zagraża argumentowi skalarnemu.źródło
Aby znaleźć rozmiar tablicy, użyj
scalar
słowa kluczowego:Aby znaleźć ostatni indeks tablicy, istnieje
$#
(zmienna domyślna Perl). Daje ostatni indeks tablicy. Gdy tablica zaczyna się od 0, otrzymujemy rozmiar tablicy, dodając jedną do$#
:Przykład:
Wynik:
źródło