perlclib - Sustitutos internos de funciones de la biblioteca estándar de C
Los miembros del equipo de desarrollo principal (Perl porters) deben tener en cuenta que en perl no se usa mucho la biblioteca estándar de C internamente; por ejemplo, ctype.h se usa muy poco. Esto se debe a que en el desarrollo de Perl se ha seguido la tendencia de reimplementar o abstraer funciones de la biblioteca estándar, para controlar cómo van a funcionar exactamente.
Este documento es una hoja de referencia para programadores que conocen la biblioteca de C y desean hacer las cosas al estilo de Perl. Indica las funciones que deben usar en lugar de las funciones de C de uso común.
En las tablas siguientes:
t
es un tipo.
p
es un puntero.
n
es un número.
s
es una cadena.
sv, av, hv, etc. representan variables de sus tipos respectivos.
sv
av
hv
En lugar de las funciones de stdio.h debe usar la abstracción de capas de Perl. En lugar de tipos FILE* debe manipular tipos PerlIO*. No olvide que con PerlIO, la nueva abstracción de E/S en capas, los tipos FILE* podrían no estar disponibles. Vea también la documentación de perlapio para obtener más información acerca de las siguientes funciones:
FILE*
PerlIO*
perlapio
En lugar de: Use: stdin PerlIO_stdin() stdout PerlIO_stdout() stderr PerlIO_stderr() fopen(fn, mode) PerlIO_open(fn, mode) freopen(fn, mode, stream) PerlIO_reopen(fn, mode, perlio) (obsoleta) fflush(stream) PerlIO_flush(perlio) fclose(stream) PerlIO_close(perlio)
En lugar de: Use: fprintf(stream, fmt, ...) PerlIO_printf(perlio, fmt, ...) [f]getc(stream) PerlIO_getc(perlio) [f]putc(stream, n) PerlIO_putc(perlio, n) ungetc(n, stream) PerlIO_ungetc(perlio, n)
Tenga en cuenta que en PerlIO las funciones equivalentes a fread y fwrite son ligeramente distintas de sus homólogas de la biblioteca de C:
fread
fwrite
fread(p, size, n, stream) PerlIO_read(perlio, buf, numbytes) fwrite(p, size, n, stream) PerlIO_write(perlio, buf, numbytes) fputs(s, stream) PerlIO_puts(perlio, s)
No existe nada equivalente a fgets; en su lugar, debe usar sv_gets:
fgets
sv_gets
fgets(s, n, stream) sv_gets(sv, perlio, append)
En lugar de: Use: feof(stream) PerlIO_eof(perlio) fseek(stream, n, whence) PerlIO_seek(perlio, n, whence) rewind(stream) PerlIO_rewind(perlio) fgetpos(stream, p) PerlIO_getpos(perlio, sv) fsetpos(stream, p) PerlIO_setpos(perlio, sv) ferror(stream) PerlIO_error(perlio) clearerr(stream) PerlIO_clearerr(perlio)
En lugar de: Use: t* p = malloc(n) Newx(id, p, n, t) t* p = calloc(n, s) Newxz(id, p, n, t) p = realloc(p, n) Renew(p, n, t) memcpy(dst, src, n) Copy(src, dst, n, t) memmove(dst, src, n) Move(src, dst, n, t) memcpy(dst, src, sizeof(t)) StructCopy(src, dst, t) memset(dst, 0, n * sizeof(t)) Zero(dst, n, t) memzero(dst, 0) Zero(dst, n, char) free(p) Safefree(p) strdup(p) savepv(p) strndup(p, n) savepvn(p, n) (Atención: strndup no existe) strstr(big, little) instr(big, little) strcmp(s1, s2) strLE(s1, s2) / strEQ(s1, s2) / strGT(s1,s2) strncmp(s1, s2, n) strnNE(s1, s2, n) / strnEQ(s1, s2, n)
Observe que el orden de los argumentos de Copy y Move es distinto del de los argumentos de memcpy y memmove.
Copy
Move
memcpy
memmove
Sin embargo, generalmente deseará manipular valores SV internamente, en lugar de manipular cadenas char * sin procesar:
char *
strlen(s) sv_len(sv) strcpy(dt, src) sv_setpv(sv, s) strncpy(dt, src, n) sv_setpvn(sv, s, n) strcat(dt, src) sv_catpv(sv, s) strncat(dt, src) sv_catpvn(sv, s) sprintf(s, fmt, ...) sv_setpvf(sv, fmt, ...)
Tenga en cuenta que también están disponibles sv_catpvf y sv_vcatpvfn, que combinan la concatenación con la aplicación de formato.
sv_catpvf
sv_vcatpvfn
A veces, en lugar de inicializar en cero el montículo (heap) asignado mediante Newxz(), podría preferir la opción de "envenenar" los datos. El envenenamiento de datos consiste en escribir en los datos un patrón de bits que no que sean válidos como punteros (ni como números de punto flotante), ni (esperamos que de forma sorprendente) como enteros, a fin de que todo código que intente usar los datos sin la preparación necesaria genere un error cuanto antes. El envenenamiento se puede realizar mediante las macros Poison(), que tienen argumentos similares a los de Zero():
PoisonWith(dst, n, t, b) "garabatea" el byte b en la memoria PoisonNew(dst, n, t) igual que PoisonWith(dst, n, t, 0xAB) PoisonFree(dst, n, t) igual que PoisonWith(dst, n, t, 0xEF) Poison(dst, n, t) igual que PoisonFree(dst, n, t)
Perl implementa dos tipos de pruebas de clases de caracteres: las de un tipo usan variables char y, por tanto, no son compatibles con Unicode (y, en consecuencia, son obsoletas a menos que esté seguro de que debe usarlas) y las del otro tipo usan variables UV y saben lo que son las propiedades Unicode. En la tabla siguiente, c es un char y u es un código de carácter Unicode.
char
UV
c
u
En lugar de: Use: O mejor: isalnum(c) isALNUM(c) isALNUM_uni(u) isalpha(c) isALPHA(c) isALPHA_uni(u) iscntrl(c) isCNTRL(c) isCNTRL_uni(u) isdigit(c) isDIGIT(c) isDIGIT_uni(u) isgraph(c) isGRAPH(c) isGRAPH_uni(u) islower(c) isLOWER(c) isLOWER_uni(u) isprint(c) isPRINT(c) isPRINT_uni(u) ispunct(c) isPUNCT(c) isPUNCT_uni(u) isspace(c) isSPACE(c) isSPACE_uni(u) isupper(c) isUPPER(c) isUPPER_uni(u) isxdigit(c) isXDIGIT(c) isXDIGIT_uni(u) tolower(c) toLOWER(c) toLOWER_uni(u) toupper(c) toUPPER(c) toUPPER_uni(u)
En lugar de: Use: atof(s) Atof(s) atol(s) Atol(s) strtod(s, &p) Ninguna. No la use. strtol(s, &p, n) Strtol(s, &p, n) strtoul(s, &p, n) Strtoul(s, &p, n)
También están disponibles las funciones grok_bin, grok_hex y grok_oct de numeric.c para convertir cadenas que representan números en sus respectivas bases en valores NV.
grok_bin
grok_hex
grok_oct
NV
En teoría, Strtol y Strtoul no se pueden definir si el equipo en el que se ha compilado perl no dispone de strtol y strtoul. Pero como estas dos funciones forman parte de la especificación de ANSI C del año 1989, sospechamos que actualmente estarán disponibles en todas partes.
Strtol
Strtoul
int rand() double Drand01() srand(n) { seedDrand01((Rand_seed_t)n); PL_srand_called = TRUE; } exit(n) my_exit(n) system(s) No la use. Vea pp_system o use my_popen getenv(s) PerlEnv_getenv(s) setenv(s, val) my_putenv(s, val)
Ni se le ocurra usar las funciones de setjmp.h. Si esto no le disuade de sus intenciones, al menos plantéese usar la pila JMPENV de scope.h en su lugar.
JMPENV
Para signal/sigaction, use rsignal(signo, handler).
signal
sigaction
rsignal(signo, handler)
perlapi, perlapio, perlguts
Joaquín Ferrero (Tech Lead)
Enrique Nell (Language Lead)
To install POD2::ES, copy and paste the appropriate command in to your terminal.
cpanm
cpanm POD2::ES
CPAN shell
perl -MCPAN -e shell install POD2::ES
For more information on module installation, please visit the detailed CPAN module installation guide.