Đây là lệnh perlclib có thể chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình mô phỏng trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS
CHƯƠNG TRÌNH:
TÊN
perlclib - Thay thế nội bộ cho các chức năng thư viện C tiêu chuẩn
MÔ TẢ
Một điều người khuân vác Perl nên lưu ý là perl không có xu hướng sử dụng nhiều C
thư viện tiêu chuẩn nội bộ; bạn sẽ thấy rất ít việc sử dụng, chẳng hạn như ctype.h
chức năng ở đó. Điều này là do Perl có xu hướng thực hiện lại hoặc thư viện tiêu chuẩn trừu tượng
để chúng ta biết chính xác chúng sẽ hoạt động như thế nào.
Đây là thẻ tham khảo dành cho những người đã quen với thư viện C và muốn làm
mọi thứ theo cách Perl; để cho họ biết những chức năng nào họ nên sử dụng thay vì nhiều chức năng hơn
chức năng C bình thường.
công ước
Trong các bảng sau:
"t"
là một loại
"p"
là một con trỏ.
"n"
là một số.
"S"
là một chuỗi.
"sv", "av", "hv", v.v. đại diện cho các biến thuộc loại tương ứng.
Tập tin Hoạt động
Thay cho stdio.h các hàm, bạn nên sử dụng lớp trừu tượng Perl. Thay vì
loại "FILE*", bạn cần xử lý loại "PerlIO*". Đừng quên điều đó với cái mới
Các kiểu "FILE*" trừu tượng I/O lớp PerlIO thậm chí có thể không có sẵn. Xem thêm
Tài liệu "perlapio" để biết thêm thông tin về các chức năng sau:
Thay vì: Sử dụng:
stdin PerlIO_stdin()
thiết bị xuất chuẩn PerlIO_stdout()
stderr PerlIO_stderr()
fopen(fn, chế độ) PerlIO_open(fn, chế độ)
freopen(fn, mode, stream) PerlIO_reopen(fn, mode, perlio) (Dep-
được kể lại)
fflush(stream) PerlIO_flush(perlio)
fclose(stream) PerlIO_close(perlio)
Tập tin Đầu vào và Đầu ra
Thay vì: Sử dụng:
fprintf(luồng, fmt, ...) PerlIO_printf(perlio, fmt, ...)
[f]getc(stream) PerlIO_getc(perlio)
[f]putc(stream, n) PerlIO_putc(perlio, n)
ungetc(n, suối) PerlIO_ungetc(perlio, n)
Lưu ý rằng các từ tương đương trong PerlIO của "fread" và "fwrite" hơi khác so với
Đối tác thư viện C:
fread(p, size, n, stream) PerlIO_read(perlio, buf,numytes)
fwrite(p, size, n, stream) PerlIO_write(perlio, buf,numytes)
fputs(s, luồng) PerlIO_puts(perlio, s)
Không có từ nào tương đương với "fgets"; thay vào đó nên sử dụng "sv_gets":
fgets(s,n,stream) sv_gets(sv, perlio,append)
Tập tin Định vị
Thay vì: Sử dụng:
feof(stream) PerlIO_eof(perlio)
fseek(stream, n, từ đâu) PerlIO_seek(perlio, n, từ đâu)
tua lại(luồng) PerlIO_rewind(perlio)
fgetpos(stream, p) PerlIO_getpos(perlio, sv)
fsetpos(stream, p) PerlIO_setpos(perlio, sv)
ferror(stream) PerlIO_error(perlio)
clearr(stream) PerlIO_clearerr(perlio)
Bộ nhớ Quản lý và Chuỗi Xử lý
Thay vì: Sử dụng:
t* p = malloc(n) Newx(p, n, t)
t* p = calloc(n, s) Newxz(p, n, t)
p = realloc(p, n) Gia hạn(p, n, t)
memcpy(dst, src, n) Sao chép(src, dst, n, t)
memmove(dst, src, n) Di chuyển(src, dst, n, t)
memcpy(dst, src, sizeof(t)) StructCopy(src, dst, t)
bộ nhớ(dst, 0, n * sizeof(t)) Zero(dst, n, t)
memzero(dst, 0) Zero(dst, n, char)
miễn phí(p) An toàn(p)
strdup(p) savepv(p)
strndup(p, n) savepvn(p, n) (Này, strndup không
hiện hữu!)
strstr(lớn, nhỏ) instr(lớn, nhỏ)
strcmp(s1, s2) strLE(s1, s2) / strEQ(s1, s2)
/strGT(s1,s2)
strncmp(s1, s2, n) strnNE(s1, s2, n) / strnEQ(s1, s2, n)
memcmp(p1, p2, n) memNE(p1, p2, n)
!memcmp(p1, p2, n) memEQ(p1, p2, n)
Lưu ý thứ tự đối số của "Sao chép" và "Di chuyển" khác với thứ tự được sử dụng trong "memcpy" và
"ghi nhớ".
Tuy nhiên, trong hầu hết các trường hợp, bạn sẽ muốn xử lý các SV nội bộ thay vì xử lý thô
chuỗi "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, ...)
Cũng lưu ý sự tồn tại của "sv_catpvf" và "sv_vcatpvfn", kết hợp nối với
định dạng.
Đôi khi thay vì xóa vùng heap được phân bổ bằng cách sử dụng Newxz() bạn nên xem xét
“đầu độc” dữ liệu. Điều này có nghĩa là viết một mẫu bit vào đó sẽ là bất hợp pháp vì
con trỏ (và số dấu phẩy động), và cũng hy vọng đủ đáng ngạc nhiên dưới dạng số nguyên,
để bất kỳ mã nào cố gắng sử dụng dữ liệu mà không suy tính trước sẽ bị hỏng sớm hơn
hơn sau này. Ngộ độc có thể được thực hiện bằng cách sử dụng Poison () macro, có đối số tương tự
đến Số không():
PoisonWith(dst, n, t, b) viết nguệch ngoạc bộ nhớ với byte b
PoisonNew(dst, n, t) bằng PoisonWith(dst, n, t, 0xAB)
PoisonFree(dst, n, t) bằng PoisonWith(dst, n, t, 0xEF)
Poison(dst, n, t) bằng PoisonFree(dst, n, t)
Nhân vật Lớp Kiểm tra
Có một số loại kiểm tra lớp ký tự mà Perl thực hiện. Những người duy nhất
được mô tả ở đây là những cái tương ứng trực tiếp với các hàm thư viện C hoạt động trên
Các ký tự 8 bit, nhưng có những ký tự tương đương hoạt động trên các ký tự rộng và UTF-8
chuỗi được mã hóa. Tất cả đều được mô tả đầy đủ hơn ở mục “Phân loại ký tự” trên perlapi
và "Thay đổi kiểu chữ" trong perlapi.
Các thủ tục của thư viện C được liệt kê trong bảng bên dưới trả về các giá trị dựa trên hiện tại
miền địa phương. Sử dụng các mục trong cột cuối cùng cho chức năng đó. Hai cái kia
các cột luôn giả sử ngôn ngữ POSIX (hoặc C). Các mục trong cột ASCII chỉ
có ý nghĩa đối với đầu vào ASCII, trả về FALSE cho bất kỳ thứ gì khác. Chỉ sử dụng những thứ này khi bạn
Biết Đó là những gì bạn muốn. Các mục trong cột Latin1 giả định rằng không phải ASCII
Các ký tự 8 bit theo định nghĩa của Unicode, chúng giống như ISO-8859-1, thường được gọi là tiếng Latin
1.
Thay vì: Sử dụng cho ASCII: Sử dụng cho Latin1: Sử dụng cho ngôn ngữ:
isalnum(c) isALPHANUMERIC(c) isALPHANUMERIC_L1(c) isALPHANUMERIC_LC(c)
isalpha(c) isALPHA(c) isALPHA_L1(c) isALPHA_LC(u )
isascii(c) isASCII(c) isASCII_LC(c)
isblank(c) isBLANK(c) isBLANK_L1(c) isBLANK_LC(c)
iscntrl(c) isCNTRL(c) isCNTRL_L1(c) isCNTRL_LC(c)
isdigit(c) isDIGIT(c) isDIGIT_L1(c) isDIGIT_LC(c)
isgraph(c) isGRAPH(c) isGRAPH_L1(c) isGRAPH_LC(c)
islow(c) isLOWER(c) isLOWER_L1(c) isLOWER_LC(c)
isprint(c) isPRINT(c) isPRINT_L1(c) isPRINT_LC(c)
ispunct(c) isPUNCT(c) isPUNCT_L1(c) isPUNCT_LC(c)
isspace(c) isSPACE(c) isSPACE_L1(c) isSPACE_LC(c)
isupper(c) isUPPER(c) isUPPER_L1(c) isUPPER_LC(c)
isxdigit(c) isXDIGIT(c) isXDIGIT_L1(c) isXDIGIT_LC(c)
tower(c) toLOWER(c) toLOWER_L1(c) toLOWER_LC(c)
toupper(c) toUPPER(c) toUPPER_LC(c)
Để nhấn mạnh rằng bạn chỉ đang thao tác trên các ký tự ASCII, bạn có thể thêm "_A" vào mỗi ký tự
của các macro trong cột ASCII: "isALPHA_A", "isDIGIT_A", v.v.
(Không có mục nào trong cột Latin1 cho "isascii" mặc dù có một
"isASCII_L1", giống hệt "isASCII"; tên sau rõ ràng hơn. Không có
mục nhập trong cột Latin1 cho "toupper" vì kết quả có thể không phải là Latin1. Bạn có
để sử dụng "toUPPER_uni", như được mô tả trong "Thay đổi kiểu chữ" trong perlapi.)
stdlib.h chức năng
Thay vì: Sử dụng:
atof(s) atof(s)
atoi(s) grok_atoUV(s, &uv, &e)
atol(s) grok_atoUV(s, &uv, &e)
strtod(s, &p) Không có gì. Chỉ cần không sử dụng nó.
strtol(s, &p, n) grok_atoUV(s, &uv, &e)
strtoul(s, &p, n) grok_atoUV(s, &uv, &e)
Cách sử dụng điển hình là kiểm tra phạm vi trên "uv" trước khi truyền:
int tôi; tia cực tím; char* end_ptr;
if (grok_atoUV(đầu vào, &uv, &end_ptr)
&& uv <= INT_MAX)
i = (int)uv;
... /* tiếp tục phân tích cú pháp từ end_ptr */
} Else {
... /* lỗi phân tích cú pháp: không phải số nguyên thập phân trong phạm vi 0 .. MAX_IV */
}
Cũng lưu ý các hàm "grok_bin", "grok_hex" và "grok_oct" trong số.c cho
chuyển đổi các chuỗi biểu diễn các số trong các cơ số tương ứng thành "NV". Lưu ý rằng
grok_atoUV () không xử lý các đầu vào âm hoặc khoảng trắng ở đầu (có mục đích
nghiêm ngặt).
Lưu ý rằng strtol () và strtoul () có thể được cải trang thành Strtol (), Strtoul (), Atol (), Atoul ().
Tránh những điều đó, quá.
Về lý thuyết, "Strtol" và "Strtoul" có thể không được xác định nếu Perl máy được xây dựng trên
thực tế không có strtol và strtoul. Nhưng vì 2 chức năng đó là một phần của 1989
Chúng tôi nghi ngờ rằng thông số kỹ thuật ANSI C hiện nay bạn sẽ tìm thấy chúng ở khắp mọi nơi.
int rand() nhân đôi Drand01()
srand(n) {seedDrand01((Rand_seed_t)n);
PL_srand_gọi = TRUE; }
thoát(n) my_exit(n)
(các) hệ thống Không. Nhìn vào pp_system hoặc sử dụng my_popen.
getenv(s) PerlEnv_getenv(s)
setenv(s, val) my_setenv(s, val)
hỗn hợp chức năng
Bạn thậm chí không nên muốn sử dụng setjmp.h có chức năng, nhưng nếu bạn nghĩ mình làm được, hãy sử dụng
Xếp chồng "JMPENV" trong phạm vi.h thay thế.
Đối với "tín hiệu"/"sigaction", hãy sử dụng "rsignal(signo, handler)".
Sử dụng perlclib trực tuyến bằng dịch vụ onworks.net