it-swarm.it

Trova la dimensione di una matrice in Perl

Mi sembra di aver trovato 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
232
David

Il primo e il terzo modo sono gli stessi: valutano un array in un contesto scalare. Considererei questo come il modo standard per ottenere le dimensioni di un array.

Il secondo modo restituisce effettivamente l'ultimo indice dell'array, che non è (solitamente) uguale alla dimensione dell'array.

223

Primo, il secondo non è equivalente agli altri due. $#array restituisce l'ultimo indice dell'array, che è uno in meno della dimensione dell'array.

Gli altri due sono praticamente uguali. Stai semplicemente utilizzando due diversi mezzi per creare un contesto scalare. Si tratta di una questione di leggibilità.

Personalmente preferisco il seguente:

say [email protected];          # 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'ultima sembra abbastanza chiara da sola, ma trovo che la linea in più toglie la chiarezza quando fa parte di un altro codice. È utile per insegnare cosa @array fa nel contesto scalare, e forse se si desidera utilizzare $size più di una volta.

37
ikegami

Questo ottiene la dimensione forzando la matrice in un contesto scalare, in cui viene valutata come la sua dimensione:

print scalar @arr;

Questo è un altro modo per forzare l'array in un contesto scalare, poiché viene assegnato a una variabile scalare:

my $arrSize = @arr;

Questo ottiene l'indice dell'ultimo elemento dell'array, quindi in realtà è la dimensione meno 1 (supponendo che gli indici inizino a 0, che è regolabile in Perl sebbene farlo di solito sia una cattiva idea):

print $#arr;

Quest'ultimo non è veramente buono da usare per ottenere le dimensioni dell'array. Sarebbe utile se vuoi solo ottenere l'ultimo elemento dell'array:

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

Inoltre, come puoi vedere qui su Stack Overflow, questo costrutto non viene gestito correttamente dalla maggior parte degli evidenziatori di sintassi ...

27
Nate C-K

Per utilizzare il secondo modo, aggiungi 1:

print $#arr + 1; # Second way to print array size
6
jhoanna

Tutti e tre danno lo stesso risultato se modifichiamo un po 'il secondo:

my @arr = (2, 4, 8, 10);

print "First result:\n";
print scalar @arr; 

print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.

print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;
5
Zon

Esempio:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
5
dimas

Esistono vari modi per stampare le dimensioni dell'array. Ecco i significati di tutti: diciamo che il nostro array è my @arr = (3,4);

Metodo 1: scalare

Questo è il modo giusto per ottenere dimensioni degli array.

print scalar @arr;  # prints size, here 2

Metodo 2: numero indice

$#arr fornisce l'ultimo indice di un array. quindi se array ha dimensione 10, il suo ultimo indice sarà 9.

print $#arr;     # prints 1, as last index is 1
print $#arr + 1; # Add 1 to last index to get array size

Stiamo aggiungendo 1 qui considerando array come 0-indexed . Ma, se non è basato su zero allora, questa logica fallirà .

Perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;'   # prints 6

L'esempio sopra mostra 6, perché abbiamo impostato il suo indice iniziale su 4. Ora indice sarebbe 5 e 6, con gli elementi 3 e 4 rispettivamente.

Metodo 3:

Quando un array viene utilizzato in contesto scalare, restituisce la dimensione dell'array

my $size = @arr;
print $size;   # prints size, here 2

In realtà il metodo 3 e il metodo 1 sono gli stessi.

2
Kamal Nayan

La sezione "Perl tipi variabili" della documentazione perlintro contiene

La variabile speciale $#array ti dice l'indice dell'ultimo elemento di un array:

print $mixed[$#mixed];       # last element, prints 1.23

Potresti essere tentato di usare $#array + 1 per dirti quanti oggetti ci sono in un array. Non preoccuparti Come accade, usando @array dove Perl si aspetta di trovare un valore scalare ("in contesto scalare") ti darà il numero di elementi nella matrice:

if (@animals < 5) { ... }

La documentazione di perldata copre anche questo nella sezione "Valori scalari" .

Se si valuta una matrice in contesto scalare, viene restituita la lunghezza della matrice. (Si noti che questo non è vero per gli elenchi, che restituiscono l'ultimo valore, come l'operatore C virgola, né delle funzioni integrate, che restituiscono qualsiasi cosa vogliano restituire.) Quanto segue è sempre vero:

scalar(@whatever) == $#whatever + 1;

Alcuni programmatori scelgono di utilizzare una conversione esplicita in modo da non lasciare nulla a dubitare:

$element_count = scalar(@whatever);

In precedenza nella stessa sezione si documenta come ottenere l'indice dell'ultimo elemento di un array.

La lunghezza di un array è un valore scalare. È possibile trovare la lunghezza dell'array @days valutando $#days, come in csh. Tuttavia, questa non è la lunghezza della matrice; è il pedice dell'ultimo elemento, che è un valore diverso poiché di solito c'è un elemento 0 °.

2
Greg Bacon

Da perldoc perldata , che dovrebbe essere sicuro di citare:

Quanto segue è sempre vero:

scalar(@whatever) == $#whatever + 1;

Fintanto che non fai $ # qualunque cosa sia ++ e aumenti misteriosamente la dimensione o il tuo array.

Gli indici della matrice iniziano con 0.

e

È possibile troncare un array fino a zero assegnando l'elenco null () ad esso. I seguenti sono equivalenti:

    @whatever = ();
    $#whatever = -1;

Il che mi porta a ciò che stavo cercando, che è come rilevare che l'array è vuoto. L'ho trovato se $ # vuoto == -1;

2
jwal

Che dire di int(@array) perché minaccia l'argomento come scalare.

1
Reflective

Per trovare la dimensione di un array usa la parola chiave scalar:

print scalar @array;

Per scoprire l'ultimo indice di un array, esiste $# (variabile di default Perl). Fornisce l'ultimo indice di un array. Quando un array inizia da 0, otteniamo la dimensione dell'array aggiungendo uno a $#:

print "$#array+1";

Esempio:

my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";

Produzione:

3

3
0
Sandeep_black