• Publicidad

Directiva strict

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Directiva strict

Notapor ricar » 2011-11-15 05:06 @254

Hola a todos.

Si utiliza la directiva strict, Win32::Perms y opendir, el programa me falla.

Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use Win32::Perms;
  3.  
  4. my $user = Win32::Perms->new($fichero)->Owner;
  5. print "$user\n";
  6.  
  7. opendir(DIR, $otroFichero);
  8. @array = readdir(DIR);
  9. foreach my $key (@array) {
  10. print "$key\n";
  11. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Si elimino lo relativo a Win32::Perms, el programa funciona.

Como podéis observar, no tiene relación lo que hace Win32::Perms con lo que hace opendir(), me refiero a que no utilizan variables comunes, son dos partes completamente independientes... al menos en teoría :S.

Es sólo un ejemplo, por lo que no he inicializado variables ni nada por el estilo.

Edito: El error que me da es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can´t use string ("2") as a symbol ref while "strict refs" in use at ejemplo.pl line 14
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La línea 14, en este caso hace referencia a opendir().

No entiendo por qué hace referencia al valor "2" ¿¿??

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Publicidad

Re: Directiva strict

Notapor explorer » 2011-11-15 05:58 @290

A ver... con el 'strict' activado, daría el aviso de que la variable $otroFichero no está declarada antes.

Faltan líneas a ese ejemplo...

¿Puedes poner un ejemplo completo, con el menor número de líneas, en donde se repita el error?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Directiva strict

Notapor ricar » 2011-11-15 06:13 @301

Ya lo había advertido.

Ejemplo completo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.    
  2. use strict;
  3. use Win32::Perms;
  4.  
  5. my $fichero = "C:\\temp";
  6. my $otroFichero = "C:\\Perl";
  7. my $user = undef;
  8. my @array;
  9.  
  10. $user = Win32::Perms->new($fichero)->Owner;
  11. print "$user\n";
  12.      
  13. opendir(DIR, $otroFichero);
  14. @array = readdir(DIR);
  15. foreach my $key (@array) {
  16. print "$key\n";
  17. }
  18.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Directiva strict

Notapor explorer » 2011-11-15 08:54 @412

Estoy sospechando que el error está, realmente, en la línea 10... al pasar el objeto del new() al Owner().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Directiva strict

Notapor ricar » 2011-11-15 12:25 @559

Hola explorer.

No está ahí el error.

Si comentas todo lo relativo a Win32::Perms. El programa funciona.
Si comentas lo relativo a opendir() y descomentas lo anterior. El programa funciona.
Si vuelves a comentar lo relativo a Win32::Perms, excepto el "use Win32::Perms" y descomentas lo relativo a opendir, el programa falla.

No sé si me he explicado correctamente. Digamos que son dos programas independientes que funcionan correctamente por separado, pero si los unes...

El problema está entre Win32::Perms y opendir() pero desde que accedes al módulo (use) del primero.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353

Re: Directiva strict

Notapor explorer » 2011-11-15 15:11 @674

Vale, aceptemos entonces que el tema esté en el opendir()... entonces...

1.- Lo primero, quitaría el 'DIR', y lo sustituiría por una variable local. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. opendir(my $DIR, $otroFichero);
  2. @array = readdir($DIR);
  3. closedir $DIR;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


2.- Segundo (si no funciona la primera opción), es, obligar a que use la función opendir() de Perl (quizás el módulo tiene definido su propia función opendir()). Así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. CORE::opendir(my $DIR, $otroFichero);
  2. @array = readdir($DIR);
  3. closedir $DIR;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Directiva strict

Notapor ricar » 2011-11-16 03:06 @171

Hola explorer.

La primera opción es válida. Pensaba que el error estaría en el fichero de entrada... pero como en las buenas películas, el "culpable" era otro :P.

Muchas gracias.

Un saludo,
Ricar.
ricar
Perlero nuevo
Perlero nuevo
 
Mensajes: 71
Registrado: 2009-07-13 07:29 @353


Volver a Intermedio

¿Quién está conectado?

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