[Perl] leer lineas aleatorias de un archivo.

Alexandros googlemail pc.alexandros en gmail.com
Mar Mayo 16 14:27:22 CDT 2006


El mar, 16-05-2006 a las 08:34 -0500, Salvador Ortiz Garcia escribió:

> Si tienes el archivo digamos en @file entonces  
> 
>    $file[int(rand(@file))]
> 
> será alguna de esas lineas (Uso el hecho de que @file en contexto
> escalar es la cardinalidad del arreglo)
> 
> Si necesitas sacar, digamos 10 lineas al azar de 'archivo.txt' a @some:
>  
>   open(FILE,'<archivo.txt') or die "No puedo abrir bla bla bla: $!\n";
>   @file = <FILE>;
>   my @some = ();
>   push @some, $file[int rand @file] for(1..10);

En primer lugar gracias por la rapida respuesta.

El problema es (y creo que se me olvido decirlo en el primer mensaje),
que quiero que las lineas no se repitan, osea (siguiendo con tu
ejemplo), en @some no deberían poder repetirse dos mismas líneas de
'archivo.txt'. Es ahí donde reside el problema de utilizar int(), lo
suyo sería poder utilizar int() pero descartando los numeros que ya ha
sacado antes (¿se puede hacer esto?).

Bueno, mientras escribo esto se me esta ocurriendo que podría sustituir
el valor que saco del array por el ultimo valor de dicho array
eliminando este, así, aunque el int() saque el mismo numero el valor del
array será diferente, algo como:

{...}
for (1..10) {
    $foo = int(rand($#file));
    push @some, $file[$foo];
    $file[$foo] = pop(@file);
}

Bueno, de todas formas lo encio por si existe una solocion "mejor" y en
cualquier caso, mejor o peor queda resuelto.
    
> > > Necesito sacar un grupo de lineas aleatorio desde un archivo; En
> > > principio tengo todo el archivo linea por linea metido en un array y he
> > > pensado en usar la funcion rand() pero no se como hacerlo. ¿quizas
> > > mezclando sort() y rand()?



Más información sobre la lista de distribución Perl