Zistenie veľkosti poľa v jazyku Perl

Zdá sa mi, že som narazil na niekoľko rôznych spôsobov, ako zistiť veľkosť poľa. Aký je rozdiel medzi týmito tromi metódami?

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
Riešenie

Prvý a tretí spôsob sú rovnaké: vyhodnocujú pole v skalárnom kontexte. Považoval by som to za štandardný spôsob, ako získať veľkosť poľa.

Druhý spôsob v skutočnosti vracia posledný index poľa, ktorý (zvyčajne) nie je rovnaký ako veľkosť poľa.

Komentáre (8)

Po prvé, druhá možnosť nie je rovnocenná s ostatnými dvoma. $#array vracia posledný index poľa, ktorý je o jeden menší ako veľkosť poľa.

Ostatné dva sú prakticky rovnaké. Jednoducho používate dva rôzne prostriedky na vytvorenie skalárneho kontextu. Ide o otázku čitateľnosti.

Ja osobne uprednostňujem nasledovné:

say 0+@array;          # Represent @array as a number

Zdá sa mi to jasnejšie ako

say scalar(@array);    # Represent @array as a scalar

a

my $size = @array;
say $size;

Samotný kód vyzerá celkom jasne, ale zdá sa mi, že dodatočný riadok znižuje prehľadnosť, keď je súčasťou iného kódu. Je'užitočný na výučbu toho, čo robí @array v skalárnom kontexte, a možno ak chcete použiť $size viac ako raz.

Komentáre (13)

Veľkosť sa získa tak, že sa pole vloží do skalárneho kontextu, v ktorom sa vyhodnotí ako jeho veľkosť:

print scalar @arr;

Toto je ďalší spôsob, ako vynútiť pole do skalárneho kontextu, keďže sa priraďuje do skalárnej premennej:

my $arrSize = @arr;

Tým sa získa index posledného prvku v poli, takže je to vlastne veľkosť mínus 1 (za predpokladu, že indexy začínajú od 0, čo je v Perle nastaviteľné, hoci je to zvyčajne zlý nápad):

print $#arr;

Toto posledné nie je veľmi dobré použiť na zistenie veľkosti poľa. Bol by užitočný, ak chcete získať len posledný prvok poľa:

my $lastElement = $arr[$#arr];

Ako môžete vidieť tu na Stack Overflow, väčšina zvýrazňovačov syntaxe túto konštrukciu nespracúva správne...

Komentáre (2)