• Publicidad

Constantes "públicas" o "externas"

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

Constantes "públicas" o "externas"

Notapor Ragnarok » 2008-03-02 13:24 @600

Hola.
Estoy haciendo mi primer proyecto con Perl. Se trata de un pequeño compilador para mi clase de taller de compiladores.

Tengo experiencia (meramente académica) utilizando C, C++ y Java (y algo de PHP, pero no cuenta).

Lo que quiero hacer es lo siguiente:

En Java tengo una clase con un campo público:

import...

Sintáxis: [ Descargar ] [ Ocultar ]
  1. public class A{ 
  2. public static final int VAR = 1; 
  3. ... 


y puedo acceder a ella desde el cuerpo de un método en cualquier otra clase utilizando:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. int var = A.VAR; 


¿Puedo hacer algo similar en Perl?

Bueno, es algo muy simple, creo. Lo necesito porque estoy haciendo un escáner para mi compilador y al ir generando tokens quiero construirlos con su tipo, pero quiero poder hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  $token = Token->new($cadena, ... );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


que en Java seria el equivalente a:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. Token token = new Token(cadena, Token.TIPODETOKEN); 


así que me falta lo que iría en lugar de...

Leyendo tutoriales encontré que se usa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  use constant CONSTANTE => valor
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero no pude usarlo de la forma que pretendo.

Ojalá me puedan ayudar.
Ragnarok
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-03-02 13:11 @591

Publicidad

Notapor explorer » 2008-03-02 14:30 @646

Bienvenido a los foros de Perl en Español, Ragnarok.

Yo creo que lo comentas en la primera parte del mensaje tuyo, es lo que se llama "datos de la clase", es decir, variables que almacenan la misma información para todos los objetos de esa clase, y que cualquier objeto puede cambiar y el resto de objetos ven los cambios.

Mírate la sección Class Data en el perltoot, en donde se comenta una forma de hacerlo: con variables globales. Hay otras formas, claro. Algunas incluyen usar algunos de los módulos de CPAN, como Class::Data::Inheritable.

No dejes de mirar otros tutoriales de la POO en Perl, como perlboot (para principiantes), perlobj (para la definición de objetos en Perl), perlbot (trucos Perl en POO) y perltooc (Tutorial sobre los datos de clase en Perl) (el que realmente te interesa).

Lo que no tengo muy claro es lo que quieres hacer según lo que comentas en la segunda parte del mensaje.

Lo que sí vas a notar al ver los tutoriales, es que hay muchas formas de trabajar en la POO en Perl, a diferencia de Java, que tiene una estructura rígida y clara de cómo hacerlo. El que se pueda hacer de varias formas en Perl es también lo bueno y lo malo: puedes elegir la forma, pero no hay una forma "estándar".

En los últimos años, la técnica que más se recomienda utilizar es la que se llama objetos Inside-Out.

Es imprescindible que te leas el artículo Unix Review Column 63 para que veas la diferencia entre las dos técnicas. También existe un módulo al respecto: Object::InsideOut.
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

Notapor explorer » 2008-03-02 14:45 @656

Volviendo a leer el mensaje, me doy cuenta de que hablas de "constantes".

Te recomiendo usar el módulo Readonly, en lugar del 'constant'.

De todas formas, sigo sin ver claramente lo que quieres hacer. Parece que quieres crear un objeto Token a partir de la $cadena leída, y dándole un parámetro más, que es el tipo de token leído.

Lo que sí puedes hacer es pasar ese tipo de token como una constante, definida tanto con 'constant' como con 'Readonly':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $token = Token->new($cadena,TIPODETOKEN);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En caso de duda, puedes probar a publicar parte del código, por si podemos ver dónde puede estar 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

Notapor Ragnarok » 2008-03-02 16:22 @724

Gracias por tu respuesta, revisare los modulos que mencionas.

El porque lo quiero asi es debido a que mi scanner analizará caracter por caracter una cadena de entrada, e irá armando los tokens. Una subrutina nextToken sera la que analizará la cadena y determinara de que tipo se trata, asi como recabara información adicional (número de línea donde apareció, offset etc...).

La línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $token = Token->new($cadena,TIPODETOKEN);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

podra ser válida a pesar de que TIPODETOKEN esté definida dentro de otra clase?

Bueno, ya repasando mis ideas me he hecho pelotas y tengo que reacomodar mis pensamientos...

Llevo ya algunos meses leyendo algunos articulos sobre Perl y viendo algo de codigo, pero solo hasta ahora tengo la oportunidad de iniciarme, espero poder adentrarme en el lenguaje, porque me parece bastante interesante.
Ragnarok
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-03-02 13:11 @591


Volver a Básico

¿Quién está conectado?

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