Sto lavorando a un progetto che a un certo punto ottiene un elenco di file da un server ftp. A quel punto restituisce un arrayrif di file OPPURE, se viene passato un riferimento regex facoltativo (ad esempio qr
), filtra l'elenco utilizzando grep. Inoltre, se lo qr
ha un gruppo di acquisizione, considera la sezione acquisita come un numero di versione e restituisce invece un hashref in cui le chiavi sono le versioni ei valori sono i nomi dei file (che sarebbe stato restituito come matrice se non ci sono gruppi di cattura) . Il codice è simile (semplificato un po ')Contare i gruppi di cattura in una regex qr?
sub filter_files {
my ($files, $pattern) = @_;
my @files = @$files;
unless ($pattern) {
return \@files;
}
@files = grep { $_ =~ $pattern } @files;
carp "Could not find any matching files" unless @files;
my %versions =
map {
if ($_ =~ $pattern and defined $1) {
($1 => $_)
} else {
()
}
}
@files;
if (scalar keys %versions) {
return \%versions;
} else {
return \@files;
}
}
Questa implementazione cerca di creare l'hash e lo restituisce se riesce. La mia domanda è: posso rilevare che lo qr
ha un gruppo di cattura e tenta solo di creare l'hash se lo fa?
fammi vedere se capisco: si abbina una stringa vuota contro l'alternanza di niente o la mia regex. Il nulla lo lascia corrispondere, ma popola sempre @ +, che quindi ha il numero di gruppi di cattura come numero di elementi. Ho ragione? Molto intelligente! –
(correzione) ... che quindi ha un elemento in più rispetto alla cattura (poiché $ + [0] è la corrispondenza) ma poiché $ # + è uno in meno del numero di elementi, restituisce il numero corretto di corrispondenze –
@JoelBerger , Esattamente. :-) – Qtax