Perl

Perl

Posted by nomadli on October 18, 2021

语法

  • $x = 123;
  • %x = (‘a’=>123,….); x{‘a’};
  • %x = (‘a’, 123,….); x{‘a’};
  • @x = (1, 2, 3, 4, 5); $x[0]; @x2 = @x; $count = @x; push pop
  • ”” 转义其中的\x 及$x做为变量替换为值 ‘’ 不转义任何字符及变量
  • $str = «“EOF”; …. EOF 转义\x 及 $x
  • $str = «‘EOF’; …. EOF 不转义任何字符及变量
  • $x =~ … 变量与模式匹配时返回true, 未匹配时返回false, $1匹配引用
  • $x !~ … 变量与模式匹配时返回false, 未匹配时返回true,
  • $0 $1 在(perl 脚本文件]之间的参数, perl -e xx.pl $0=-e $1=xx.pl
  • $ARGV 数组 脚本后的参数 perl xx.pl a b $ARGV[0] a $ARGV[1] b
  • @INC 所有perl module的查找路径 是数组 push(@INC, xx, …)在末尾添加
  • use xx; 引用模块, 只在@INC中查找, 并必须是xx.pm
  • require /a/b/xx.c 在use的基础上可以指定路径及后缀

C

  • SV 类型代表Perl的标量
  • AV 类型代表Perl的数组
  • HV 类型代表Perl的Table
  • RV 引用类型
  • SV* newSViv(long i) 创建一个Perl的整型标量, 实际子类型 IV
  • SV* newSVnv(double f) 创建一个Perl的浮点标量, 实际子类型 NV
  • SV* newSVpn(char *str, int len) 创建一个Perl的字符串, 实际子类型 PV
  • AV* newAV() 创建一个Perl的空数组
  • AV* av_make(int num, SV**) 创建一个Perl数组,并赋值
  • HV* newHV() 创建一个Perl的空Table
  • sv_setiv(SV*, long) 修改整型标量
  • sv_setnv(SV*, double) 修改整型浮点量
  • sv_setpv(SV, char, int) 修改字符串
  • SvIV(SV*) 修改Perl任意标量为整型标量
  • SvNV(SV*) 修改Perl任意标量为浮点型标量
  • SvPV(SV*) 修改Perl任意标量为字符串
  • av_len(AV*) 获取Perl数组长度
  • SV* av_fetch(AV*, int idx, int clear) 获取Perl数组中的值,clear!=0将设置为undef
  • av_store(AV, int idx, SV) 设置Perl数组中的值
  • av_push av_pop av_shift av_unshift
  • hv_store(HV, char *key, u32 klen, SV, u32 hash) 设置Key Value
  • SV** hv_fetch(HV*, char *key, u32 klen, i32 clear) 取值
  • hv_iterinit(HV*) 开始迭代,返回kv个数
  • HE* hv_iternextsv(HV*, char **key, i32 *klen) 返回迭代的下一个kv
  • SV* perl_get_sv(char *name,int create)获取Perl中的标量
  • AV* perl_get_av(char *name,int create)获取Perl中的数组
  • HV* perl_get_hv(char *name,int create)获取Perl中的Table
  • bool SvIOK(SV*) 判断是否为整型标量
  • bool SvNOK(SV*) 判断是否为浮点型标量
  • bool SvPOK(SV*) 判断是否为字符串
  • bool SvROK(SV*) 判断是否为Table
  • SVT SVTYPTE(SV*) 返回SVt_IV SVt_NV SVt_PV SVt_PVHV
  • sv_dump(SV*) 打印标量值
  • sv_2mortal(SV*) 将C创建的标量内存托管给Perl自动管理
  • SV* sv_newmortal(SV*) 创建一个空的Perl托管SV变量

C调用Perl

  • 堆栈操作
    • dSP 初始化环境
    • ENTER 开始作用域
    • SAVETMPS 设置环境,以便临时变量在作用域的末尾会被自动删除
    • PUSHMARK 记住堆栈的当前栈顶
    • XPUSH* 将参数压入堆栈
    • PUTBACK 表示参数的末尾
    • perl_call_pv(char*, G_ARRAY); 调用Perl函数
    • SPAGAIN 表示返回值回收的开始
    • POP* 从堆栈获得值
    • PUTBACK 表示返回值回收的末尾
    • LEAVE 结束作用域