• Publicidad

Perl a Fortran (punteros)

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

Re: Perl a Fortran (punteros)

Notapor explorer » 2010-10-29 12:46 @573

El doble '$', en realidad es una abreviatura de ${ ... }. Es decir, que
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        $$refpar = $val;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

es lo mismo que
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        ${$refpar} = $val;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

así que el valor de $val se guarda en la variable referenciada por $refpar ($refpar guarda una referencia a una variable escalar).

Aunque... también podría ser una referencia simbólica...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$name  = "foo";
$$name = 1;     # Actualiza el valor de $foo
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Todo lo relacionado con referencias lo puedes encontrar en perlref.
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

Publicidad

Re: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-11-02 05:28 @269

Ahora tengo un problema con un ciclo if() y es que en Fortran tienes que poner
IF(condición)
sentencia
ENDIF


pero resulta que he llegado a un punto en el que el programa sólo dice

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        if ($funcval) {$npoint++;}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No sé cómo interpretar la condición.

if ($funcval), es decir, estoy acostumbrado a poner un número mayor, menor que, etcétera; aquí sólo pone si funcval, pero no entiendo cuándo se ejecuta la sentencia dentro del if().

Muchas gracias.
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Re: Perl a Fortran (punteros)

Notapor wanako » 2010-11-02 06:12 @300

Las comparaciones numéricas y alfanuméricas también existen en Perl como en C [==,>,lg,lt,etc], en este caso especial Perl evalúa solamente si $funcval fué definida, cualquier valor asignado a la variable será considerado afirmativo/verdadero y continuará en el bloque, a tener cuidadillo, es preferible que si $funcval recibe el valor de una función ¿funcval()? evaluarla directamente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( funcval() ) { $npoint++; }
$npoint++ unless funcval();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Re: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-11-02 07:14 @343

Entendido, sólo se ejecuta si funcval ha sido definida, pero en Fortran no existe esa opción. ¿Se les ocurre alguna forma de hacer lo mismo con Fortran o con otro lenguaje que me sirva de ejemplo para hacer lo mismo con Fortran? Gracias.
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Re: Perl a Fortran (punteros)

Notapor explorer » 2010-11-02 07:25 @351

No es del todo exacto lo que te ha comentado wanako...

La sentencia
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($funcval) {$npoint++;}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

quiere decir: post-incrementa la variable $npoint si la variable $funcval contiene un valor verdadero.

wanako dice que vale conque la expresión esté definida, pero en Perl, una cosa es que esté definida y otra cuál es su valor de verdad.

Por ejemplo, si $funcval vale 0, entonces sí que está definida, pero su valor de verdad es el de falso.

De perlsyn:
Verdad y Falsedad

El número 0, las cadenas '0' y '', la lista vacía "()", y "undef" son todos falso en contexto booleando. Todos los demás valores son verdaderos.

La negación de un valor de verdad, por "!" o "not" devuelve un valor falso especial. Cuando es evaluado como cadena es tratado como '', pero como número, es tratado como un 0.

En Fortran, si sabes que $funcval contiene valores numéricos, te vale con poner en el IF() si el valor de funcval es mayor que 0. Si contiene una cadena de caracteres, te vale con saber si funcval es distinto de ''.
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: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-11-02 12:15 @552

Muchas gracias por responder; lo he solucionado con un .TRUE..

IF(funcval==.TRUE.)THEN
npoint=npoin+1
ENDIF


Ahora tengo otro problema y es la siguiente expresión
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$sta[$ind] %= $size - $ind + 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y no sé a qué se refiere %=; lo he visto antes para hashes pero no es el caso y lo he visto para obtener el módulo pero la expresión era diferente; por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
IF($ncasos % 10 == 0)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

que es el módulo de $ncasos dividido entre 10 pero %= no sé a qué se refiere esta expresión.

Gracias
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Re: Perl a Fortran (punteros)

Notapor explorer » 2010-11-02 12:24 @558

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$sta[$ind] %= $size - $ind + 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

es lo mismo que
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$sta[$ind] = $sta[$ind]  %  ($size - $ind + 1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en perldoc perlop, sección Assignment Operators.

P.D. Hay que leer un poquito más... ;)
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: Perl a Fortran (punteros)

Notapor wanako » 2010-11-02 19:59 @874

explorer escribiste:No es del todo exacto lo que te ha comentado wanako...


Ups... muy cierto...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
0 and print "verdad\n" or print "mentira\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Eso porque hago mal uso de defined() :mrgreen:
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Re: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-11-04 07:00 @333

Muchas gracias, sí que trato de leer por mi cuenta pero a veces me surgen dudas y por eso pregunto.

Tengo otra duda.

Sé que shift() saca el primer elemento de un array, pero en la siguiente línea no entiendo muy bien qué hace.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @sta = @{shift;};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sé que es una copia de un arreglo a otro. ¿Por qué no usar directamente @destino = @origen?

¿Se declara el arreglo @sta y almacena en el array @sta lo que saca del arreglo con shift()?
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Re: Perl a Fortran (punteros)

Notapor explorer » 2010-11-04 07:33 @356

Pues aquí estamos, para responder esas dudas :)

En my @sta = @{shift;};, primero shift() saca un elemento del array por defecto, que es @ARGV si estamos en contexto de programa, o de @_ si estamos dentro de una subrutina. Por su apariencia diría que es lo segundo, así que lo que estamos haciendo es sacar uno de los argumentos pasados a la subrutina.

Luego, este argumento se interpreta como una referencia a una array. Con el conjunto @{ ... }, extraemos todos los elementos del array y los metemos en @sta.

Esto se hace así para no tener que pasar el array, todos sus elementos, como argumentos a la subrutina. Sólo se pasa la referencia al array como un único argumento. Algo así:

subrutina(\@array);

El porqué luego dentro de la subrutina hace una copia de todos los elementos del array, en lugar de referirse a ellos de forma indirecta, ya es cosa del programador. Quiero decir que también podía haber escrito

my $array_ref = shift;

my $elemento_5 = $array_ref->[4]; # El quinto elemento
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

Anterior

Volver a Básico

¿Quién está conectado?

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

cron