El Sistema de FLAGS de Perl

En Perl el sistema de banderas utiliza los primeros 24 bits de un entero de 32 bits. Los restantes 8 bits se utilizan para almacenar información sobre el tipo. Las banderas nunca se acceden directamente: La API de Perl provee un conjunto de macros para su lectura y modificación (Véase la sección SV Flags de la documentación en perlapi).

Por ejemplo, el módulo Readonly provee una forma alternativa de tener constantes en Perl 5. En el caso de los escalares lo hace manipulando la bandera READONLY:

lhp@nereida:~/Lperl/src/XSUB/Example$ perl -MDevel::Peek -MReadonly -de 0
main::(-e:1):   0
  DB<1> Readonly::Scalar $sca => 4
  DB<2> Dump $sca
SV = IV(0x838349c) at 0x8462efc
  REFCNT = 1
  FLAGS = (IOK,READONLY,pIOK)
  IV = 4

El código del submódulo Readonly::XS que se encarga de las constantes escalares es extraordinariamente compacto:

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

MODULE = Readonly::XS   PACKAGE = Readonly::XS    

int
is_sv_readonly(sv)
    SV *sv
PROTOTYPE: $
CODE:
    RETVAL = SvREADONLY(sv);
OUTPUT:
    RETVAL

void
make_sv_readonly(sv)
    SV *sv
PROTOTYPE: $
CODE:
    SvREADONLY_on(sv);

Casiano Rodríguez León
2010-03-22
REF="node281.html"> next up previous contents index PP2PP2 moodlepsmodulosperlmonksperldocgoogleetsiiullpcgull
Sig: El Sistema de FLAGS Sup: Las Interioridades de Perl Ant: Argumentos de Salida en
Casiano Rodríguez León
2010-04-19
lues Sup: Las Interioridades de Perl Ant: Tipos de Escalares Perl
Casiano Rodríguez León
2010-04-20
strict; 3 use B; 4 5 my $s = sub { 6 my $a = shift; 7 print $a+1; 8 }; 9 10 my $b = B::svref_2object($s); 11 my $op = $b->START; 12 my ($class, $name, $desc); 13 format STDOUT = 14 @<<<<<<<<<@|@<<<<<<<<<<<<@|@<<<<<<<<<<<<<<<<<<<<<<<<< 15 $class, '|', $name, '|', $desc 16 . 17 do { 18 ($class, $name, $desc) = (B::class($op), $op->name, $op->desc); 19 write; 20 } while $op = $op->next and !$op->isa("B::NULL"); Es necesario comprobar que $op no es un objeto B::NULL ya que el puntero next es un puntero C que B deja disponible sin envoltorio alguno.

Salida en Orden de Ejecución

La ejecución produce la secuencia de operaciones en orden de ejecución:

pp2@nereida:~/src/perl/B$ bex2.pl | cat -n
 1  COP       | nextstate    | next statement
 2  PADOP     | gv           | glob value
 3  UNOP      | rv2av        | array dereference
 4  UNOP      | shift        | shift
 5  OP        | padsv        | private variable
 6  BINOP     | sassign      | scalar assignment
 7  COP       | nextstate    | next statement
 8  OP        | pushmark     | pushmark
 9  OP        | padsv        | private variable
10  SVOP      | const        | constant item
11  BINOP     | add          | addition (+)
12  LISTOP    | print        | print
13  UNOP      | leavesub     | subroutine exit
 my $s = sub {
   my $a = shift;
   print $a+1;
 };

El Módulo B::Terse

El módulo B::Terse tiene una opción -exec que permite ver el orden de ejecución de un código:

pp2@nereida:~/src/perl/B$ perl -MO=Terse,-exec -e 'my $s = 4'
OP (0x816d298) enter
COP (0x816d300) nextstate
SVOP (0x816d588) const [2] IV (0x8150388) 4
OP (0x816d4a0) padsv [1]
BINOP (0x816d5e0) sassign
LISTOP (0x816d468) leave [1]
-e syntax OK



Subsecciones
Casiano Rodríguez León
2011-02-07
tex2html8" HREF="http://www.google.es/">googleetsiiullpcgullLHPLHP moodleperlcriticpbpblogsgoogle code project hosting
Sig: El Módulo O Sup: Las Interioridades de Perl Ant: Las Interioridades de Perl
Casiano Rodríguez León
2011-02-21
gopcgull.gif" ALT="pcgull">
Sig: El Módulo O Sup: Las Interioridades de Perl Ant: Las Interioridades de Perl
Casiano Rodríguez León
2011-02-21