Estoy trabajando en un proyecto que en un momento dado obtiene una lista de archivos de un servidor ftp. En ese momento, devuelve una matriz de archivos O, si se pasa una referencia regex opcional (es decir, qr
), filtra la lista hacia abajo usando grep. Además, si ese qr
tiene un grupo de captura, trata la sección capturada como un número de versión y devuelve un hashref donde las claves son las versiones y los valores son los nombres de los archivos (que se hubieran devuelto como la matriz si no hubiera grupos de captura) . El código es el siguiente (simplificado ligeramente)¿Cuenta los grupos de captura en una expresión regular 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;
}
}
Esta aplicación intenta crear el hash y lo devuelve si tiene éxito. Mi pregunta es: ¿puedo detectar que el qr
tiene un grupo de captura y solo intenta crear el hash si lo hace?
déjame ver si lo consigo: emparejas una cadena vacía con la alternancia de nada o mi expresión regular. La nada permite que coincida, pero aún se rellena @ +, que luego tiene el número de grupos de captura como la cantidad de elementos. ¿Estoy en lo cierto? ¡Muy inteligente! –
(corrección) ... que tiene un elemento más que capturas (ya que $ + [0] es la coincidencia) pero como $ # + es uno menos que el número de elementos, devuelve el número correcto de coincidencias –
@JoelBerger exactamente :-) – Qtax