[Perl] Pregunta #3
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Thu, 14 Mar 2002 11:46:52 -0600 (CST)
> Es lo mesmo... El ejemplo del problema es solo una simplificaci=F3n p=
ara
> sacar la idea general y luego aplicarlo a cada caso particular... Y
> descubrimos que hay tres formas de hacerlo, la mala, la buena y la PERL. =
La
> tercera forma ya se expuso con el c=F3digo entendible, que en tu caso ser=
ia
> muy similar...
>
> my %Temporal
> foreach my $Fic1 (@IndiceFichero1) {
> $Temporal{$Fic}=3D1;
> }
>
> foreach my $Fic2 (@IndiceFichero2) {
> $Temporal{$Fi2}++;
> }
>
> #Si quieres saber ("sacar") cuales son iguales, solo revisa que el valor =
sea
> igual a 2.
>
> foreach my $Tem (keys %Temporal) {
> if ($Temporal=3D=3D2) { print "Indice $Tem esta duplicado.\n"; }
> }
>
> Como ya tienes los indices de los duplicados ya puedes hacer con ello=
s
> lo que quieras. Obviamente si lo haces directamente sobre el disco rigido=
,
> tal como recomienda Salvador, ser=E1 mucho m=E1s r=E1pido y eficiente .
> Adicionalmente interesante con esta opci=F3n es que puedes comparar multi=
ples
> archivos, y con hashes de hashes ir marcando donde estan ubicados los
> duplicados o triplicados, etc.
>
> Aqui si se aplica la excelente observaci=F3n de Gunnar porque exactam=
ente
> como son un monton de "warnings" te ahorras tiempo si asignas sobre todo
> cuando son archivos inmensamente grandes. Pero ahorita viendo el c=F3digo
> solamente funciona para el primer foreach, no para el segundo, ya que pod=
r=EDa
> haber "warnings" debido a que el indice no es necesariamente asignando en=
el
> primero. Grave problema si el Fichero2 es mucho mas grande que el Fichero=
1.
> (alguna soluci=F3n Gunnar, o no queda de otra).
Umm... =BFPor qu=E9 sigues teniendo el $Temporal{$Fi2}++;?
El que te aparezcan warnings no s=F3lo hace que sea m=E1s lento, sino que t=
e
indica d=F3nde est=E1s cag=E1ndola. El ver warnings en tu programa te debe =
hacer
corregirlo para evitarlos.
Si quieres contar cu=E1ntas ocurrencias de cada llave hay, te sugiero algo
as=ED:
foreach my $Fic1 (@IndiceFichero1, @IndiceFichero2) {
# =BFPara qu=E9 hacer dos ciclos si puedes hacer uno s=F3lo?
if defined $Temporal{$Fic} {
$Temporal{$Fic}++;
} else {
$Temporal{$Fic} =3D 1;
}
}
foreach my $tem (sort keys %Temporal) {
print "El =EDndice $tem aparece $Temporal->{$tem} veces\n";
}
>(...)
> Esto es relativamente seguro(un pleonasmo, porque la seguridad siempr=
e
> es relativa) ya que alguien con seis neuronas pensantes puede poner
> "sistema.pl?VPreportes=3D1" y accesar a tu pantalla de reportes sin haber
> pasado por el login(claro que podr=EDas haber generado una cookie al inic=
io
> para verificar la sesion, pero tendrias que estar la verificando a cada
> ratito y refrescarla, y finalmente como veremos esto es innecesario excep=
to
> que le quieras poner doble "seguridad").
Varias maneras de evitar esto... La primera, muy simple, evitar ser
llamado por GET si recibimos alg=FAn par=E1metro:
die 'Me llamaron brinc=E1ndose las reglas!' if (param() && request_method n=
e 'POST');
La segunda, m=E1s simple y recomendable a=FAn: Siempre verificar que el
usuario sea v=E1lido al iniciar la sesi=F3n. (c=F3digo feo ejemplo)
verificaUsuario(param('user')) if param();
(...)
sub verificaUsuario {
my $usr=3Dshift;
return 0 if usuarioValido($usr);
print h3('Vete a la goma. No me caes bien.'), end_html;
exit 0;
}
--=20
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF