• Publicidad

Subrutina que recibe referencias de vectores

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

Subrutina que recibe referencias de vectores

Notapor trujin » 2009-01-09 12:15 @552

Hola, tengo un problema con una referencia; a ver, si llamo a una subrutina así: mirutina([1,2,3], [2,3,4]); ¿cómo puedo jugar con esos valores? por ejemplo, ponerlos en un vector nuevo o compararlos...

Y otra cosa, ¿habría alguna manera de saber si estos valores que le paso a la subrutina son números?

¡Gracias!
trujin
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2009-01-04 12:53 @578

Publicidad

Notapor explorer » 2009-01-09 12:48 @575

Primero veamos qué es lo que recibimos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use Data::Dumper;

mirutina([1,2,3], [2,3,4]);

sub mirutina {
    print Dumper \@_;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
la salida es
Código: Seleccionar todo
$VAR1 = [
          [
            1,
            2,
            3
          ],
          [
            2,
            3,
            4
          ]
        ];
así que lo que recibimos son dos arreglos anónimos (o, dicho de otra manera, dos referencias a dos arreglos).

Entonces, algunas formas de leerlos, dentro de la subrutina:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    my @vectores = @_;     # Cada elemento de @vectores contiene una referencia a un arreglo
    print $vectores[0][1]; # 2
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    my ($vector1_ref, $vector2_ref) = @_;
    my @vector1 = @$vector1_ref;           # Un arreglo, copia del referenciado por $vector1_ref
    my @vector2 = @$vector2_ref;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    my @vectores1 = @{$_[0]};  # Sacamos el primer arreglo directamente
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: Subrutina que recibe referencias de vectores

Notapor explorer » 2009-01-09 12:53 @578

trujin escribiste:Y otra cosa, ¿habría alguna manera de saber si estos valores que le paso a la subrutina son números?

Una forma de hacerlo es comprobando cada elemento, para ver si son números.

Si buscas por números enteros, usa una expresión regular, como por ejemplo /^\d+$/.

Para casos más complejos, usar Regexp::Common.
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 trujin » 2009-01-09 13:09 @589

Esta parte my ($vector1_ref, $vector2_ref) = @_; no la ponía entre paréntesis y por eso me fallaba, ¿El uso de este paréntesis es como hacer un casting en Java?
trujin
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2009-01-04 12:53 @578

Notapor explorer » 2009-01-09 15:00 @666

Perl no tiene casting (no le hace falta la mayor parte de las veces).

Esos paréntesis corresponde a my(), que es una función (sorprendente... ¿no?... una función que está a la izquierda de una asignación... pero así queda más "expresivo" lo que queremos hacer en esa línea).
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 trujin » 2009-01-09 17:24 @767

Y porque si le quito los parantesis me pone esto:
Can't use string ("1") as an ARRAY ref while "strict refs" in use at com.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;
use warnings;

sub segment {
 
    my $vector1_ref = @_;
    my @vector1 = @$vector1_ref;  #En esta linea da el error

    for (0 .. @vector1 - 1) {
      print $vector1[$_];
    }
}

segment([1,2,3]);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
trujin
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2009-01-04 12:53 @578

Notapor explorer » 2009-01-09 18:36 @817

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $vector1_ref = @_;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Estás haciendo una asignación de un arreglo a un escalar. Lo que hace Perl es evaluar el arreglo en contexto escalar. En esa situación, del arreglo obtenemos el número de elementos que contiene, en tu caso, un '1' (porque @_ contiene un elemento).

Seguramente querrás decir
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $vector1_ref = $_[0];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
o
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $vector1_ref = shift @_;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
o
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $vector1_ref = shift;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
o
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($vector1_ref) = @_;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es decir, leer el primer valor de @_ y pasarlo a $vector1_ref. En el último ejemplo ves que he puesto los paréntesis. Eso quiere decir que tenemos un contexto de lista a ambos lados. Perl pasará los valores del arreglo a la lista de valores de my(). Como solo hay uno, pues solo pasará uno.

Más información en perldata, sección Scalar-values, donde dice "If you evaluate an array in scalar context, it returns the length of the array".

Y en Crea tus propias funciones.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron