Newsgroup: it.comp.lang.perl
Titolo: Estrazione numeri consecutivi da array

Ciao a tutti
 Ho un problema semplice ma sul quale sto andando in fissa(sarà perchè
sono nuovo al perl:-)
ho un array tipo questo
@array=(1,2,3,4,8,9,10,24);
e vorrei estrarre da questo array solo il primo e l'ultimo estremo di
ogni sottogruppo di numeri consecutivi.
cioè dal sottoinsieme che va da 1 a 4  solo i valori 1 4
         dal sottoinsieme che va da 8 a 10  solo i valori 8 10
Qualcuno mi sa suggerire un metodo semplice da applicare ?
grazie per qualunque suggerimento
Guido

           dal sottoinsieme che va da 8 a 10  solo i valori 8 10
Ho preso per buono che il 24 non è un estremo di alcun sottogruppo e 
dunque non lo stampo. Il codice è il seguente, sperando sia corretto (e 
che si preservi l'indentazione):
use strict;
use warnings;
my @array=(1,2,3,4,8,9,10,24);
my $flag_contiguita=0;
my $flag_primo_valore_contiguita=0;
foreach my $indice (0 .. $#array) {
	if (!$flag_contiguita && !$flag_primo_valore_contiguita) {
 
		# entro per la prima volta nella contiguita'
 
		$flag_primo_valore_contiguita=1;
	}
	if (	($indice == $#array)
		&&
		($array[$indice-1]-1 == $array[$indice])) {
 
		# ultimo valore: se e' preceduto da un numero
		# contiguo lo stampo
 
		print "$array[$indice]\n";
		last;
	} elsif ($indice == $#array) {
		# ultimo valore non preceduto da un numero
		# contiguo: esco
		last;
	}
	if ($array[$indice]+1 == $array[$indice+1]) {
		# valore seguente contiguo
		if ($flag_primo_valore_contiguita) {
 
			# se e' il primo della serie, stampo il
			# valore attuale
 
			print "$array[$indice]\n";
			$flag_primo_valore_contiguita=0;
		}
 
		$flag_contiguita=1;
		next;
 
	} else {
		# valore seguente non contiguo: sono alla fine
		# della contiguita' e stampo il valore attuale
		$flag_contiguita=0;
		$flag_primo_valore_contiguita=0;
		print "$array[$indice]\n";
	}
}


Ahahahahahah grazie non è un compito a casa (purtroppo ;-)
Sulla base del codice che mihai  mandato ho fatto questa variante
che printa i numeri contigui e quelli isolati nel caso a qualcuno
servisse
(spero di aver ricopiato bene il codice)
@segspec=(1,3,6,7,8,10,12,13)
$indice=0;
		foreach $segspec(@segspec)
		{
			if (($segspec == ($segspec[$indice+1]-1))&&($segspec !=
($segspec[$indice-1]+1)))
			{
				print $segspec."\n";
				push(@seg,$segspec);
				push(@seg,",");
			}
			if ( ($segspec==($segspec[$indice-1]+1))&&($segspec!
=($segspec[$indice+1]-1)))
			{
				print $segspec."\n";
				push(@seg,$segspec);
				#push(@seg,",");
				push (@seg, "-");
			}
			$indice++;
		}
		foreach $seg(@seg)
		{
			print $seg."quesot e seg\n";
		}
		#print $seg[0]."---------".$seg[scalar(@seg)-1]."\n";
		$unisci =join("",@seg);
		@spezza=split("-",$unisci);
		foreach $spezza(@spezza)
		{
			print $ENSTpos."\t". $spezza."questoespezza\n";
		}
		foreach $resspec(@resspec)
		{
			print $ENSTpos."\t".$resspec."questo e resspec\n";
		}
grazie ancora a presto

 grazie ancora a presto
Di nulla, ciao :)

> Ahahahahahah grazie non è un compito a casa (purtroppo ;-)

Ognuno ragiona a suo modo, evidentemente, ma per il mio modo di ragionare è
tutto abbastanza complicato.
Così (a me) sembra più semplice:
    my @segspec = (1,2,3,4,8,9,10,24);
    my $pezzi;
    my $min = $segpec[0];
    my $max = $min;
    my $atteso = $min - 1;
    my $val;
    for my $val (@segspec) {
        ++$atteso;
        if ($val != $atteso) {
            if ($max > $min) {
                ++$pezzi;
                print 'Pezzo n° ', $pezzi, ':',
                    $min, '-', $max, "\n";
            }
            $min = $val;
            $atteso = $val;
        }
        $max = $val;
    }
    if ($max == $atteso) {
        if ($max > $min) {
            ++$pezzi;
            print 'Pezzo n° ', $pezzi, ':',
                $min, '-', $max, "\n";
        }
        $min = $val;
        $atteso = $val;
    }
Ciao.

    }
Le ultime assegnazioni naturalmente vengono dal copia e incolla, e sono
inutili:
    if ($max == $atteso) {
        if ($max > $min) {
            ++$pezzi;
            print 'Pezzo n� ', $pezzi, ':',
                $min, '-', $max, "\n";
        }
    }
Ciao.

 tutto abbastanza complicato.
^_^ E' il motivo per cui tu sei dove sei e io sono dove sono :)
Ciao.

Ecco un'altra soluzione:
my ($a,$b);
foreach my $i (@segspec) {
   if (not defined $a) {
      $a = $i;
   }
   elsif (not defined $b) {
      if ($i - $a > 1) {
         $a = $i;
      }
      else {$b = $i}
   }
   elsif ($i -$b > 1) {
      print "[$a,$b]\n";
      $a = $i;
      $b = undef;
   }
   else { $b = $i}
}
print "[$a,$b]" if defined $b;