Edit: Hash contro Array
Come cincodenada giustamente sottolineato nel commento, ysth ha dato una risposta migliore: avrei risposto alla tua domanda con un'altra domanda: "Vuoi veramente usare un array di Perl ? Un hash può essere più appropriato. "
Una matrice alloca la memoria per tutti gli indici possibili fino al più grande finora utilizzato. Nel tuo esempio, assegni 24 celle (ma ne usi solo 3). Al contrario, un hash assegna solo spazio per quei campi che sono effettivamente utilizzati.
soluzione Array: grep scalare
Qui ci sono due soluzioni possibili (vedi sotto per la spiegazione):
print scalar(grep {defined $_} @a), "\n"; # prints 3
print scalar(grep $_, @a), "\n"; # prints 3
Spiegazione: Dopo aver aggiunto $a[23]
, la matrice non contiene effettivamente 24 elementi --- ma la maggior parte di questi sono indefiniti (che viene valutato anche come falso). È possibile contare il numero di elementi definiti (come fatto nella prima soluzione) o il numero di elementi reali (seconda soluzione).
Qual è la differenza? Se si imposta $a[10]=0
, la prima soluzione la conteggia, ma la seconda soluzione no (perché 0 è falso ma definito). Se imposti $a[3]=undef
, nessuna delle soluzioni la conteggia.
soluzione Hash (da yst)
Come suggerito da un'altra soluzione, è possibile lavorare con un hash e di evitare tutti i problemi:
$a{0} = 1;
$a{5} = 2;
$a{23} = 3;
print scalar(keys %a), "\n"; # prints 3
Questa soluzione conta gli zeri e dei valori undef.
fonte
2009-05-14 14:03:05
Proveremo gli hash, grazie. – grilix
L'ultima parte di questa risposta è quella corretta. grillix sembra provenire da uno sfondo PHP. Quelli che PHP chiama "array" sono in realtà più simili agli hash di Perl, e quest'ultimo dovrebbe essere usato in casi come questo. – cincodenada
Come può questa idea essere estesa ad array multidimensionali in perl? – damned