Rompere questa linea per linea in quanto non è stato:
sub trim {
@_ = $_ if not @_ and defined wantarray;
# if there are no arguments, but a return value is requested
# then place a copy of $_ into @_ to work on
@_ = @_ if defined wantarray;
# if the caller expects a return value, copy the values in @_ into itself
# (this breaks the aliasing to the caller's variables)
for (@_ ? @_ : $_) { s/^\s+//, s/\s+$// }
# perform the substitution, in place, on either @_ or $_ depending on
# if arguments were passed to the function
return wantarray ? @_ : $_[0] if defined wantarray;
# if called in list context, return @_, otherwise $_[0]
}
Sono d'accordo che il codice diventa un po 'noiosa, con tutti i wantarray
controlli, ma il risultato è una funzione che condivide un livello di flessibilità con le funzioni integrate di Perl. Il risultato netto di rendere la funzione "intelligente" è quello di ripulire il sito di chiamata (evitando costrutti di ciclo, variabili temporanee, ripetizione, ...) che a seconda della frequenza utilizzata dalla funzione può migliorare significativamente la leggibilità del codice.
La funzione potrebbe essere semplificata un po ':
sub trim {
@_ = @_ ? @_ : $_ if defined wantarray;
s/^\s+//, s/\s+$// for @_ ? @_ : $_;
wantarray ? @_ : shift
}
Le prime due righe possono essere riuniti in un unico, dal momento che stanno facendo la stessa cosa (assegnando a @_
) solo con i valori di origine diverse. E non è necessario il controllo esterno return ... if defined wantarray
alla fine, poiché restituire un valore nel contesto vuoto non fa comunque nulla.
Ma probabilmente cambierei l'ultima riga in wantarray ? @_ : pop
in quanto ciò lo fa comportarsi come una lista (ultimo elemento in contesto scalare).
Una volta che tutto è detto e fatto, questo permette gli stili seguenti chiamata da utilizzare:
my @test_array = ('string1', ' string2', 'string3 ', ' string4 ');
my @result = trim @test_array;
my $result = trim $test_array[0];
trim @test_array; # in place trim
e anche supporta ancora il ciclo sito chiamata:
my @result = map trim, @test_array;
o più verbosely come:
my @result = map trim($_), @test_array;
e può essere utilizzato all'interno di un ciclo while simile a chomp
while (<$file_handle>) {
trim;
# do something
}
Le opinioni sulla birra in Perl sono miste. Personalmente mi piace quando le funzioni mi danno la flessibilità di codificare il chiamante in un modo che ha senso, piuttosto che aggirare l'interfaccia rigida di una funzione.
perché vuoi lasciare la mappa all'utente mentre la puoi estrarre? –
correlati: [ritaglia in Perl] (https://plus.google.com/105725977711317285348/posts/ienzxqHJmRe) – daxim
wantarray e simili merda magica sono una piaga. Non fare una programmazione intelligente a meno che non sia necessario. Mai a API intelligenti. – tsee