nereida:~/Lperl-5.9.4> sed -ne '46,64p' sv.h | cat -n
1 typedef enum {
2 SVt_NULL, /* 0 Usado para undef */
3 SVt_IV, /* 1 Entero */
4 SVt_NV, /* 2 Flotante */
5 SVt_RV, /* 3 Referencia */
6 SVt_PV, /* 4 Cadena */
7 SVt_PVIV, /* 5 Cadena o Entero */
8 SVt_PVNV, /* 6 Cadena o Flotante */
9 SVt_PVMG, /* 7 Objeto o escalar mágico */
10 SVt_PVBM, /* 8 Como SVt_PVMG: si es cadena usa Boyer-Moore para las búsquedas */
11 SVt_PVGV, /* 9 Typeglob */
12 SVt_PVLV, /* 10 Varios tipos con conducta Lvalue */
13 SVt_PVAV, /* 11 Array */
14 SVt_PVHV, /* 12 Hash */
15 SVt_PVCV, /* 13 Código */
16 SVt_PVFM, /* 14 Formato */
17 SVt_PVIO, /* 15 Manejador de ficheros */
18 SVt_LAST /* keep last in enum. used to size arrays */
19 } svtype;
En la jerga, estos tipos son conocidos como IV , NV , PV , etc.
Nótese que arrays y hashes son formas de SVs.
Existe toda una familia de funciones
con nombres SvIV , SvNV , SvPV , etc
para leer un escalar (SV) como entero, flotante, cadena, etc.
El siguiente código muestra el uso de algunas de estas funciones de
acceso:
lhp@nereida:~/Lperl/src/XSUB/inline$ cat -n dump_values.pl
1 #!/usr/local/bin/perl -w
2 use strict;
3 use Inline C => <<'EOC';
4 void dump_scalar(SV * sv) {
5
6 printf("Flotante: %f\n", SvNV(sv));
7 printf("Entero: %i\n", SvIV(sv));
8 printf("Cadena: %s\n", SvPV_nolen(sv));
9 printf("Longitud de la cadena: %i\n", SvCUR(sv));
10 printf("Longitud del espacio asignado para la cadena: %i\n", SvLEN(sv));
11 }
12 EOC
13
14 my $a = "123.53";
15 dump_scalar($a)
El caso de las cadenas es mas complejo: se puede acceder a la longitud
de la cadena mediante la macro SvCUR y a la longitud de su buffer
mediante la macro SvLEN . Al ejecutar el programa anterior obtenemos la
salida:
lhp@nereida:~/Lperl/src/XSUB/inline$ dump_values.pl Flotante: 123.530000 Entero: 123 Cadena: 123.53 Longitud de la cadena: 6 Longitud del espacio asignado para la cadena: 8
Existe una familia de funciones sv_setiv , sv_setnv , sv_setpv , etc. que permiten la modificación del escalar. Por ejemplo:
lhp@nereida:~/projects/perl/src/XSUB/inline$ cat -n set_values.pl
1 #!/usr/local/bin/perl -w
2 use strict;
3 use Inline C => <<'EOC';
4 void set_string(SV * sv) {
5 char h[256];
6 printf("Input: ");
7 scanf("%s", &h);
8 sv_setpv(sv, h);
9 }
10 EOC
11
12 my $a;
13 set_string($a);
14 print "$a\n";
Casiano Rodríguez León
