A partir de 5.10, puede utilizar named capture buffers así:
#!/usr/bin/perl
use strict; use warnings;
my %data;
my $s = 'abcdefghijklmnopqr';
if ($s =~ /abc (?<first>def) ghi (?<second>jkl) mno (?<third>pqr)/x) {
push @{ $data{$_} }, $+{$_} for keys %+;
}
use Data::Dumper;
print Dumper \%data;
Salida:
$VAR1 = {
'first' => [
'def'
],
'second' => [
'jkl'
],
'third' => [
'pqr'
]
};
Para versiones anteriores, se puede utilizar el siguiente lo que evita tener que añadir una línea para cada capturado búfer:
#!/usr/bin/perl
use strict; use warnings;
my $s = 'abcdefghijklmnopqr';
my @arrays = \ my(@first, @second, @third);
if (my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x) {
push @{ $arrays[$_] }, $captured[$_] for 0 .. $#arrays;
}
use Data::Dumper;
print Dumper @arrays;
salida:
$VAR1 = [
'def'
];
$VAR2 = [
'jkl'
];
$VAR3 = [
'pqr'
];
Pero me gusta mantener los datos relacionados en una única estructura de datos, por lo que es mejor volver a utilizar un hash. Esto requiere una matriz auxiliar, sin embargo:
my %data;
my @keys = qw(first second third);
if (my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x) {
push @{ $data{$keys[$_]} }, $captured[$_] for 0 .. $#keys;
}
O, si los nombres de las variables son muy first
, second
etc, o si los nombres de los tampones no importan pero sólo fin hace, puede utilizar :
my @data;
if (my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x) {
push @{ $data[$_] }, $captured[$_] for 0 .. $#captured;
}
¿Desea contar cuántas veces coincide el patrón? Eso es lo que me parece ... – Zaid
necesito procesar las coincidencias – Incognito