• Publicidad

Múltiples archivos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Múltiples archivos

Notapor Zeokat » 2008-12-07 10:09 @464

Digamos que tengo un archivo de texto con varias palabras.

Lo que quiero hacer es poner en un archivo las palabras que empiecen por a o A , en otro archivo las que empiecen por b o B, etc...

Para esto tengo que hacer:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open A, '>>', 'A.txt' or die $!;
open B, '>>', 'B.txt' or die $!;
open C, '>>', 'C.txt' or die $!;
etc...
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Quería saber si hay alguna forma de crear esos archivos sin que tenga que escribir tanto. Pensé en hacer lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $i (65 .. 90) {
    my $letra = chr($i);
        open (OUT.$letra, ">> $letra.txt") or die "Cannot open output file\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Me abre los archivos y funciona correctamente cuando escribo con:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($start =~ /A/) {print OUTA $line,"\n";}
                        elsif ($start =~ /B/) {print OUTB $line,"\n";}
                        elsif ($start =~ /C/) {print OUTC $line,"\n";}
etc...
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Y por último los cierro:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $i (65 .. 90) {
        close(OUT.chr($i));
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Todo funciona... pero si digo que use strict, me devuelve errores.
y además si uso el use warnings me devuelve varios warnings...

No sé cuál sería la mejor forma de abrir todos esos archivos, de escribir en ellos y por último cerrarlos sin tener que escribir tantas líneas.
Al mismo tiempo sería interesante la posibilidad de que no devolviese ningún warning y que funcionase empleando el strict.

A ver si a alguien se le ocurre algo y me puede ayudar.
Gracias de antemano. :)
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Publicidad

Notapor monoswim » 2008-12-07 10:34 @482

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @letras = (a..z);

foreach my $letra (@letras){
   open(FILE, ">$letra");
   close(FILE);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ese código debería de funcionar y no debería de tirar error con use strict...

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor Zeokat » 2008-12-07 13:06 @588

Pues si que tira error con el strict...

Además... con ese código creo los archivos, pero todos se llaman FILE... a la hora de hacer el:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   if ($start =~ /A/) {print OUTA $line,"\n";}
elsif ($start =~ /B/) {print OUTB $line,"\n";}
elsif ($start =~ /C/) {print OUTC $line,"\n";}
etc...
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No puedo mandar cada palabra a su archivo... creo que no me sirve...

Gracias de todas formas por la respuesta.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-12-07 13:18 @596

Con el uso de manejadores indirectos es posible reducir mucho el código, usando estructuras como arreglos o hash:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;

use utf8;        # Poner si estamos trabajando en modo utf8
use locale;
use open OUT => ':locale';

my @letras = ('a' .. 'z', 'á', 'é', 'í', 'ó', 'ú', 'ü', 'ñ');
my %ficheros;

## Abrir
for my $letra ( @letras ) {
    my $fichero = uc($letra) . '.txt';

    open $ficheros{$letra}, '>>', $fichero
        or die "ERROR al abrir $fichero: $!\n";
}

## Grabación
my @palabras = qw(
    En un lugar de la Mancha
    de cuyo nombre no quiero acordarme
    no ha mucho que vivía un hidalgo
);

for my $palabra ( @palabras ) {
    my $letra = lc substr $palabra, 0, 1;
    print {$ficheros{$letra}} "$palabra\n";
}

## Cerrar
close $_ foreach values %ficheros;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Notar la forma de sacar la primera letra de la palabra: con substr(). La expresión regular que estabas usando buscaba una 'A' en cualquier posición de la palabra... y además, no encontraba el caso de minúsculas.

Debería ser algo así: /^a/i (la 'i' es para indicar independencia de la capitulación)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2008-12-07 14:10 @632

Muy buena, explorer. No solo me solucionó el problema sino que hice un benchmark y antes me procesaba un archivo de 7,33 Mb en 12 segundos y ahora lo hace en 3 segundos.

En cuanto a lo de la expresión regular, tienes razón, no lo puse pero estaba usando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $start = uc(substr($line,0,1));
   if ($start =~ /A/) {print OUTA $line,"\n";}
elsif ($start =~ /B/) {print OUTB $line,"\n";}
elsif ($start =~ /C/) {print OUTC $line,"\n";}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

de ahí que no me preocupase que la expresión regular chequease solo el primer carácter.

Buenísimo. Gracias. :D
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-12-07 15:51 @702

Pero entonces no tienes ni siquiera que usar expresiones regulares, solo comparaciones de cadena de caracteres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $start = uc(substr($line,0,1));
   if ($start eq 'A') {print OUTA $line,"\n";}
elsif ($start eq 'B') {print OUTB $line,"\n";}
elsif ($start eq 'C') {print OUTC $line,"\n";}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Consigues más velocidad. De todas formas, el usar el hash es más cómodo y corto.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron