map e grep sono funzioni potenti di Perl utilizzate per lavorare con gli array:
my @nums = (1, 2, 3, 4, 5, 6); my @squared = map { $_ * $_ } @nums; # (1, 4, 9, 16, 25, 36) my @even = grep { $_ % 2 == 0 } @nums; # (2, 4, 6)
map e grep, la variabile $_ contiene per impostazione predefinita l'elemento corrente. La modifica di $_ cambierà l'elemento stesso dell'array originale, se l'array è passato per riferimento o se $_ è utilizzato esplicitamente (ad esempio, tramite alias in foreach).map restituisce sempre un elenco, grep restituisce un sottoinsieme dell'elenco originale.Domanda: Cosa fa il seguente codice e perché?
my @nums = (1..5); my @result = map { $_++ } @nums; print "@nums ";
Risposta: Questo codice non modificherà l'array originale @nums. L'operatore $_++ incrementa il valore della variabile all'interno del blocco, ma non salva queste modifiche nell'array originale, poiché map restituisce il valore modificato, ma l'array originale rimane intatto (a meno che non venga utilizzato un alias tramite foreach).
my @nums = (1..5); my @result = map { $_++ } @nums; # @result sarà (1,2,3,4,5), @nums non cambia print "@nums "; # Stampa: 1 2 3 4 5
Storia In un progetto, uno sviluppatore si aspettava che dopo
map { $_++ } @array, l'array stesso@arrayvenisse modificato. Di conseguenza, il programma continuava a lavorare con i vecchi valori, causando errori nei conteggi durante l'aggregazione dei dati.
Storia In un sistema di reportistica, durante il filtraggio di un array tramite
grep, all'interno del blocco è stata utilizzata per errore l'assegnazione$result = $_, facendo sì che tutti gli elementi venissero sovrascritti in una sola variabile, perdendo la fonte dei dati. Questo ha reso difficile il debug e ha portato a perdite nella reportistica.
Storia In uno script di integrazione, hanno applicato
mapannidati e hanno dimenticato che il contesto interno lavorava anch'esso con la variabile comune$_, causando comportamenti imprevedibili durante la modifica degli elementi, poiché ilmapinterno sovrascriveva i valori nell'array risultante.