这是命令 perlclib,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
perlclib - 标准 C 库函数的内部替换
商品描述
Perl 搬运工应该注意的一件事是 perl的 不倾向于使用那么多的 C
内部标准库; 你会看到很少使用,例如, 类型文件
里面的功能。 这是因为 Perl 倾向于重新实现或抽象标准库
功能,以便我们确切地知道它们将如何运行。
这是熟悉C库,想做的人的参考卡
Perl 方式的事情; 告诉他们应该使用哪些功能而不是更多
普通的 C 函数。
公约
在下表中:
“t”
是一种类型。
“p”
是一个指针。
“n”
是一个数字。
“ s”
是一个字符串。
“sv”、“av”、“hv”等代表各自类型的变量。
文件 营运部
而不是 标准输出文件 函数,您应该使用 Perl 抽象层。 代替
“FILE*”类型,您需要处理“PerlIO*”类型。 别忘了新的
PerlIO 分层 I/O 抽象“FILE*”类型甚至可能不可用。 另见
有关以下功能的更多信息,请参见“perlapio”文档:
代替: 使用:
标准输入 PerlIO_stdin()
标准输出 PerlIO_stdout()
标准错误 PerlIO_stderr()
fopen(fn, 模式) PerlIO_open(fn, 模式)
freopen(fn,模式,流) PerlIO_reopen(fn,模式,perlio)(Dep-
重述)
fflush(流) PerlIO_flush(perlio)
fclose(流) PerlIO_close(perlio)
文件 输入 和 输出
代替: 使用:
fprintf(流,fmt,...) PerlIO_printf(perlio,fmt,...)
[f]getc(流) PerlIO_getc(perlio)
[f]putc(流, n) PerlIO_putc(perlio, n)
ungetc(n, 流) PerlIO_ungetc(perlio, n)
请注意,“fread”和“fwrite”的 PerlIO 等价物与它们的略有不同。
C库对应:
fread(p, 大小, n, 流) PerlIO_read(perlio, buf, numbytes)
fwrite(p, 大小, n, 流) PerlIO_write(perlio, buf, numbytes)
fputs(s, 流) PerlIO_puts(perlio, s)
没有等同于“fgets”的; 应该使用“sv_gets”代替:
fgets(s, n, stream) sv_gets(sv, perlio, 追加)
文件 定位
代替: 使用:
feof(流) PerlIO_eof(perlio)
fseek(stream, n, wherece) PerlIO_seek(perlio, n, wherece)
倒带(流) PerlIO_rewind(perlio)
fgetpos(流, p) PerlIO_getpos(perlio, sv)
fsetpos(stream, p) PerlIO_setpos(perlio, sv)
ferror(流) PerlIO_error(perlio)
clearerr(流) PerlIO_clearerr(perlio)
内存 管理 和 串 处理
代替: 使用:
t* p = malloc(n) Newx(p, n, t)
t* p = calloc(n, s) Newxz(p, n, t)
p = realloc(p, n) 更新(p, n, t)
memcpy(dst, src, n) 复制(src, dst, n, t)
memmove(dst, src, n) 移动(src, dst, n, t)
memcpy(dst, src, sizeof(t)) 结构复制(src, dst, t)
memset(dst, 0, n * sizeof(t)) 零(dst, n, t)
memzero(dst, 0) 零(dst, n, char)
免费(p) 安全免费(p)
strdup(p) 保存pv(p)
strndup(p, n) savepvn(p, n) (嘿,strndup 没有
存在!)
strstr(大,小)instr(大,小)
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) 内存 (p1, p2, n)
!memcmp(p1, p2, n) memEQ(p1, p2, n)
请注意“复制”和“移动”的参数顺序与“memcpy”和“移动”中使用的参数顺序不同
“记住”。
但是,在大多数情况下,您会希望在内部处理 SV 而不是原始
"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, ...)
还要注意“sv_catpvf”和“sv_vcatpvfn”的存在,将连接与
格式。
有时不是通过使用将分配的堆归零 新xz() 你应该考虑
“中毒”数据。 这意味着在其中写入一个应该是非法的位模式
指针(和浮点数),也希望作为整数足够令人惊讶,
以便任何试图在没有预先考虑的情况下使用数据的代码都会更快地崩溃
比以后。 中毒可以用 毒() 具有相似参数的宏
至 零():
PoisonWith(dst, n, t, b) 用字节 b 涂抹内存
PoisonNew(dst, n, t) 等于 PoisonWith(dst, n, t, 0xAB)
PoisonFree(dst, n, t) 等于 PoisonWith(dst, n, t, 0xEF)
Poison(dst, n, t) 等于 PoisonFree(dst, n, t)
字符 增益级 检测
Perl 实现了几种类型的字符类测试。 唯一的
这里描述的是那些直接对应于操作的 C 库函数
8 位字符,但也有对宽字符和 UTF-8 进行操作的等价物
编码的字符串。 所有在 perlapi 的“字符分类”中都有更全面的描述
和 perlapi 中的“字符大小写变化”。
下表中列出的 C 库例程基于当前的返回值
语言环境。 将最后一列中的条目用于该功能。 另外两个
列始终假定为 POSIX(或 C)语言环境。 ASCII 列中的条目仅
对 ASCII 输入有意义,对其他任何内容返回 FALSE。 仅当您使用这些
知道 这就是你想要的。 Latin1 列中的条目假定非 ASCII
8 位字符是 Unicode 定义的,它们与 ISO-8859-1 相同,通常称为拉丁语
1.
代替:用于 ASCII:用于 Latin1:用于语言环境:
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)
islower(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)
至LOWER(c) 至LOWER(c) 至LOWER_L1(c) 至LOWER_LC(c)
toupper(c) toUPPER(c) toUPPER_LC(c)
为了强调您只对 ASCII 字符进行操作,您可以在每个字符后附加“_A”
ASCII 列中的宏:“isALPHA_A”、“isDIGIT_A”等。
(在“isascii”的 Latin1 列中没有条目,即使有
“isASCII_L1”,与“isASCII”相同; 后一个名字更清楚。 没有
在“toupper”的Latin1 列中输入,因为结果可能是非Latin1。 你有
使用“toUPPER_uni”,如 perlapi 中的“Character case changes”中所述。)
标准库 功能
代替: 使用:
atof(s) atof(s)
atoi(s) grok_atoUV(s, &uv, &e)
atol(s) grok_atoUV(s, &uv, &e)
strtod(s, &p) 没什么。 只是不要使用它。
strtol(s, &p, n) grok_atoUV(s, &uv, &e)
strtoul(s, &p, n) grok_atoUV(s, &uv, &e)
典型用途是在投射之前对“uv”进行范围检查:
国际我; 紫外线紫外线; 字符* end_ptr;
如果(grok_atoUV(输入,&uv,&end_ptr)
&& uv <= INT_MAX)
我 = (int)uv;
... /* 从 end_ptr 继续解析 */
} {
... /* 解析错误:不是范围 0 中的十进制整数 .. MAX_IV */
}
还要注意“grok_bin”、“grok_hex”和“grok_oct”函数 数字.c HPMC胶囊
将代表各个基数中数字的字符串转换为“NV”。 注意
grok_atoUV() 不处理负输入或前导空格(有目的地
严格的)。
需要注意的是 strtol() 和 strtoul() 可能伪装成 斯特罗尔(), 斯特劳尔(), 环环(), 阿图尔().
也避免这些。
理论上,如果机器 perl 建立在“Strtol”和“Strtoul”之上,则可能不会定义
实际上没有 strtol 和 strtoul。 但由于这两个功能是 2 年的一部分
ANSI C 规范我们怀疑你现在到处都能找到它们。
int rand() 双 Drand01()
srand(n) {seedDrand01((Rand_seed_t)n);
PL_srand_call = TRUE; }
退出(n) my_exit(n)
系统不要。 查看 pp_system 或使用 my_popen。
PerlEnv_getenv(s)
setenv(s, val) my_setenv(s, val)
其他 功能
你甚至不应该 想 使用 设置文件 函数,但如果您认为可以,请使用
“JMPENV”堆栈 范围.h 代替。
对于“信号”/“sigaction”,使用“rsignal(signo, handler)”。
使用 onworks.net 服务在线使用 perlclib