Skip to content

Commit

Permalink
Merge branch 'master' of github.com:zipf/perldoc-es
Browse files Browse the repository at this point in the history
  • Loading branch information
zipf committed Dec 31, 2012
2 parents 4b5243d + ea40927 commit b25f225
Show file tree
Hide file tree
Showing 13 changed files with 399 additions and 169 deletions.
329 changes: 212 additions & 117 deletions memory/work/perlspanish-omegat.explorer.tmx

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion pod/translated/perl588delta.pod
Expand Up @@ -1485,7 +1485,7 @@ Andy Lester suministró muchas mejoras para determinar qué parámetros de las f

Dave Mitchell mejoró la salida de depura del analizador léxico con C<-DT>

Nicholas Clark cambió la asignación del búfer de cadena de texto por lo que ahora es redondeado al siguiente múltiplo de 4 (u 8 en las plataformas con punteros de 64 bits). Esto debería reducir el número de llamadas a C<realloc> sin tener que llegar a utilizar ningún otro espacio de memoria adicional.
Nicholas Clark cambió la asignación del búfer de cadena de texto por lo que ahora es redondeado al siguiente múltiplo de 4 (u 8 en las plataformas con punteros de 64 bits). Esto debería reducir el número de llamadas a C<realloc> sin tener que llegar a utilizar realmente ningún otro espacio de memoria adicional.

El array de C<HV> de los C<HE*> es ahora asignado al correcto (y mínimo) tamaño, gracias a un nuevo cambio de Nicholas Clark. Compile con C<-DPERL_USE_LARGE_HV_ALLOC> para usar el viejo, descuidado, valor por defecto.

Expand Down
2 changes: 1 addition & 1 deletion pod/translated/perldata.pod
Expand Up @@ -247,7 +247,7 @@ asigna la lista completa al array @foo, pero
$foo = ('cc', '-E', $bar);

asigna el valor de la variable $bar a la variable escalar $foo.
Tenga en cuenta que el valor de un array en contexto de escalar es la longitud del array; la línea siguiente asigna el valor 3 a $foo:
Tenga en cuenta que el valor de un array real en contexto de escalar es la longitud del array; la línea siguiente asigna el valor 3 a $foo:

@foo = ('cc', '-E', $bar);
$foo = @foo; # se asigna 3 a $foo
Expand Down
135 changes: 135 additions & 0 deletions pod/translated/perldbmfilter.pod
@@ -0,0 +1,135 @@
=head1 NOMBRE

perldbmfilter - Filtros DBM de Perl

=head1 SINOPSIS

$db = tie %hash, 'DBM', ...

$filtro_anterior = $db->filter_store_key ( sub { ... } );
$filtro_anterior = $db->filter_store_value( sub { ... } );
$filtro_anterior = $db->filter_fetch_key ( sub { ... } );
$filtro_anterior = $db->filter_fetch_value( sub { ... } );

=head1 DESCRIPCIÓN

Los cuatro métodos C<filter_*> mostrados arriba están disponibles en todos los módulos DBM incluidos en Perl: DB_File, GDBM_File, NDBM_File,
ODBM_File y SDBM_File.

Todos los métodos funcionan de la misma manera y se usan para instalar (o
desinstalar) un filtro DBM individual. La única diferencia entre ellos es el lugar en el que se instala el filtro.

Su funcionamiento se puede resumir de la siguiente manera:

=over 5

=item B<filter_store_key>

Si se ha instalado un filtro con este método, se invocará cada vez que se escriba una clave en una base de datos DBM.

=item B<filter_store_value>

Si se ha instalado un filtro con este método, se invocará cada vez que se escriba un valor en una base de datos DBM.

=item B<filter_fetch_key>

Si se ha instalado un filtro con este método, se invocará cada vez que se lea una clave de una base de datos DBM.

=item B<filter_fetch_value>

Si se ha instalado un filtro con este método, se invocará cada vez que se lea un valor de una base de datos DBM.

=back

Puede usar cualquier combinación de estos métodos (desde ninguno hasta los cuatro).

Todos los métodos de filtro devuelven el filtro, si existe; de lo contrario, devuelven C<undef>.

Para eliminar un filtro debe pasarle C<undef>.

=head2 El filtro

Cuando Perl llama a uno de estos filtros, una copia local de C<$_> contendrá la clave o el valor que se va a filtrar. El filtrado se realiza modificando el contenido de C<$_>. Se omite el código de retorno del filtro.

=head2 Ejemplo: el problema de la terminación de cadenas con un carácter NULL

Los filtros DBM son útiles para un tipo de problema en el que se desea aplicar I<siempre> la misma transformación a todas las claves, a todos los valores, o a todas las claves y todos los valores.

Por ejemplo, considere el siguiente escenario. Tiene una base de datos DBM que desea compartir con una aplicación en C de terceros. La aplicación en C supone que I<todas> las claves y sus valores correspondientes terminan con un carácter NULL. Sin embargo, Perl no usa el carácter de terminación NULL al escribir en bases de datos DBM, por lo que la aplicación Perl deberá encargarse de agregar la terminación NULL. Para escribir en la base de datos debe usar una instrucción similar a la siguiente:

$hash{"$clave\0"} = "$valor\0";

También hay que tener en cuenta el carácter NULL al determinar la longitud de claves y valores existentes.

Sería mucho mejor poder ignorar el problema de los caracteres NULL de terminación de cadena en el código principal de la aplicación y disponer de un mecanismo que agregue automáticamente un carácter NULL de terminación a todas las claves y todos los valores que se escriban en la base de datos, y lo elimine al leer de la base de datos. Como ya se habrá imaginado, éste es un problema que se puede solucionar fácilmente con filtros DBM.

use strict;
use warnings;
use SDBM_File;
use Fcntl;

my %hash;
my $archivo = "filt";
unlink $archivo;

my $db = tie(%hash, 'SDBM_File', $archivo, O_RDWR|O_CREAT, 0640)
or die "No se puede abrir $archivo: $!\n";

# Instalar filtros DBM
$db->filter_fetch_key ( sub { s/\0$// } );
$db->filter_store_key ( sub { $_ .= "\0" } );
$db->filter_fetch_value(
sub { no warnings 'uninitialized'; s/\0$// } );
$db->filter_store_value( sub { $_ .= "\0" } );

$hash{"abc"} = "def";
my $a = $hash{"ABC"};
# ...
undef $db;
untie %hash;

El código anterior usa SDBM_File, pero funcionará igual con todos los módulos DBM.

El contenido de cada filtro debe ser autodescriptivo. Los dos filtros "fetch" quitan el carácter NULL de terminación y los dos filtros "store" agregan un carácter NULL de terminación.


=head2 Otro ejemplo: las claves son enteros de C

Otro ejemplo del mundo real: de manera predeterminada, cuando Perl escribe en una base de datos DBM, siempre escribe la clave y el valor como cadenas. Así, cuando se ejecuta la siguiente instrucción:

$hash{12345} = "algo";

la clave 12345 se almacenará en la base de datos DBM como una cadena de 5 bytes, "12345". Si realmente desea almacenarla como un entero de C, debe usar C<pack> al escribir y C<unpack> al leer.

El siguiente filtro DBM hace esto:

use strict;
use warnings;
use DB_File;
my %hash;
my $archivo = "filt";
unlink $archivo;


my $db = tie %hash, 'DB_File', $archivo, O_CREAT|O_RDWR, 0666, $DB_HASH
or die "No se puede abrir $archivo: $!\n";

$db->filter_fetch_key ( sub { $_ = unpack("i", $_) } );
$db->filter_store_key ( sub { $_ = pack ("i", $_) } );
$hash{123} = "def";
# ...
undef $db;
untie %hash;

El código anterior usa DB_File, pero funcionará con cualquiera de los módulos DBM.

En este caso no se han utilizado más que dos filtros; solo hay que manipular el contenido de la clave, por lo que no es necesario instalar ningún filtro de valores.

=head1 VEA TAMBIÉN

L<DB_File>, L<GDBM_File>, L<NDBM_File>, L<ODBM_File> y L<SDBM_File>.

=head1 AUTOR

Paul Marquess

0 comments on commit b25f225

Please sign in to comment.