Mi sembra di aver incontrato diversi modi per trovare la dimensione di un array. Qual è la differenza tra questi tre metodi?
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
Il primo e il terzo modo sono gli stessi: valutano un array in contesto scalare. Considererei questo come il modo standard per ottenere la dimensione di un array.
Il secondo modo in realtà restituisce l'ultimo indice dell'array, che non è (di solito) lo stesso della dimensione dell'array.
Innanzitutto, la seconda non è equivalente alle altre due. $#array
restituisce l'ultimo indice dell'array, che è uno in meno della dimensione dell'array.
Gli altri due sono virtualmente gli stessi. State semplicemente usando due mezzi diversi per creare un contesto scalare. Si tratta di una questione di leggibilità.
Personalmente preferisco il seguente:
say 0+@array; # Represent @array as a number
Lo trovo più chiaro di
say scalar(@array); # Represent @array as a scalar
e
my $size = @array;
say $size;
Quest'ultimo sembra abbastanza chiaro da solo come questo, ma trovo che la linea extra toglie chiarezza quando fa parte di altro codice. È utile per insegnare cosa fa @array
in un contesto scalare, e forse se volete usare $size
più di una volta.
Questo ottiene la dimensione forzando l'array in un contesto scalare, in cui viene valutata la sua dimensione:
print scalar @arr;
Questo è un altro modo di forzare l'array in un contesto scalare, poiché viene assegnato ad una variabile scalare:
my $arrSize = @arr;
Questo ottiene l'indice dell'ultimo elemento dell'array, quindi è in realtà la dimensione meno 1 (assumendo che gli indici inizino da 0, che è possibile in Perl anche se di solito è una cattiva idea):
print $#arr;
Quest'ultimo non è davvero buono da usare per ottenere la dimensione dell'array. Sarebbe utile se volete solo ottenere l'ultimo elemento dell'array:
my $lastElement = $arr[$#arr];
Inoltre, come potete vedere qui su Stack Overflow, questo costrutto non è gestito correttamente dalla maggior parte degli evidenziatori di sintassi...