背景
前段时间 Yaklang 实现了重构,在实现原有语法的基础上增加了很多新的语法,非常的好用。在之前的一次更新中,我们悄咪咪的更新了语言引擎,现在经过了几个版本的迭代,新语言引擎逐渐稳定。本篇简单介绍下新语言引擎一些有意思的更新内容。
完整的语言教程已经在官网更新 ,点击文末阅读原文即可快速get新语法!
报错信息
报错信息是最直观的,新引擎的报错更好看了,更方便我们写代码时排查错误。
错误信息中包含了触发异常的调用栈、文件路径、触发错误的代码所处结构(函数或是全局代码)、行号和异常代码预览。
错误处理
回顾下之前YAK的异常处理,很像Go的风格,例如:
data,err = codec.DecodeBase64("aaa")
if err{
log.info("decode error: %v",err)
return
}
dump(data)
YAK还增加了die函数,有点类似assert ,有错误则直接panic,没错则什么也不处理
data,err = codec.DecodeBase64("aaa")
die(err)
dump(data)
本次更新增加了小尾巴,效果和die类似,如下,在函数调用后增加一个~
,函数的最后一个返回值会被小尾巴吃掉,并且对它检查,如果不为空则panic。
data = codec.DecodeBase64("aaa")~
dump(data)
try-catch
的支持如下,可以对代码块捕获panic信息,当出现panic时会直接进入catch代码块处理异常。不影响代码后续执行。
try-catch还可以与小尾巴一起使用,可以对 ` 从请求包提取url instance ` 这个代码块进行异常捕获,相较于之前每次函数调用都要处理error方便多了。
字符串
字符串在原本基础上,支持了前缀,包括b、f、x。前缀b用法和python类似,可以直接创建[]byte类型数据,前缀用法f类似javascript,可以通过${}
执行表达式并拼接到字符串中,x是YAK特有的Fuzztag语法,与WebFuzzer的Fuzztag相同
除此之外还有一些有意思的语法糖,如字符串格式化、字符串切片,使用*重复字符串
类型内置函数
字符串、列表、字典类型都支持了内置函数,这里只演示几个比较常用的函数,全部函数可以去官网查看(代码补全也可以看)。
For循环
除了支持传统的for
i=0;i<n;i++ {}
用法,还支持golang风格的for index,value = range list{}
,还有新增的python风格的for in
for v in ["a", "b", "c", "d"] {
print(v)
}
// abcd
还有YAK风格的for-number用法,下面的for in
和for range
是等价的
for i in 4 {
print(i)
}
// 0123
for i range 4 {
print(i)
}
// 0123
for range 4 {
print(1)
}
// 1111
作用域相关
新版本对作用域进行了更严格的限制,支持块级作用域
if true {
a = 1
}
dump(a) // 输出为nil
顺便还解决了旧版本的老问题,以后可以这样使用了
for i = range 10{
go func(i){
print(i)
}(i)
}
time.sleep(1)
// 输出 9861405732
支持闭包,闭包函数定义时会继承当前作用域,如下,虽然For循环结束了,但For代码块的作用域由于被闭包函数继承,所以并不会被销毁。
a = 1
for i = range 10{
a = func(){
println(i)
}
}
a() // 输出9
STRICT模式
对于未声明的变量,Yaklang的处理方式是赋予nil值并在控制台warn log警告。但这种对未声明变量的使用,几乎都是非预期的,可能会造成一些非预期的错误,所以提供了strict模式。
在环境变量中添加YVMODE=strict即可开启
对于未声明变量,会在Yak Runner中标注出来,编译时会抛出编译错误
总结
本篇介绍了Yaklang的部分更新,真的很好用,师傅们可以在插件中使用新语法了,完整的介绍请戳阅读原文直达官网教程!
往期推荐
仅需10秒!从批量爆破请求中提取关键数据,安全能力基座功能强化ing