se non c'è un'esigenza particolare non conviene mai mettere il contenuto di un file in un array, in quanto hai un grande spreco di memoria.
Per le tue esigenze dovrebbe andare bene:
codice:
# questo è il criterio di ricerca
$match = "(Art\.1)|(Art\.5)|(Art\.10)";
# setti una variabile di controllo
$ver = 0;
open (FILE, "<legge.html")||die "$!";
# leggi il file riga per riga
# senza caricarlo in memoria
while (<FILE>) {
# se trovi una riga che corrisponde all'inizio
# di un articolo che ti interessa estrai il numero,
# setti la variabile di verifica ad 1 e stabilisci
# il numero dell'articolo successivo a cui cessa
# la memorizzazione
if (/$match/) {
$art = $+;
$art =~ s/Art\.//;
$ver = 1;
$art_succ = $art + 1;
}
# quando incontri l'articolo successivo
# setti la verifica a 0
if (/Art\.$art_succ/) {
$ver = 0;
}
# se la verifica è 1 memorizzi le righe in un hash
# di array, con questa struttura
# %arts = (
# 1 => [righe articolo 1],
# 5 => [righe articolo 5],
# 10 => [righe articolo 10]
# );
if ($ver == 1) {
push(@{$arts{$art}}, $_);
}
}
close (FILE);
# poi lo stampi così:
foreach $art (sort{$a <=> $b} keys %arts) {
foreach $riga (@{$art}) {
print $riga;
}
}
il codice sopra non è testato, quindi potrebbe contenere errori, e poi lo devi personalizzare, ma serve a darti un'idea di un algoritmo possibile.