最近写Awk比较多,所以写了一些便于自己使用的函数。

Print


function printX(o, _indent, _x){
  if(typeof(o) != "array"){ print o; return; }
  for(_x in o){
    if(typeof(o[_x]) != "array"){
      print _indent, _x, ":", o[_x];
    }else{
      print _indent, _x, ":";
      printX(o[_x], _indent"  ");
    }
  }
}

打印嵌套结构的Awk Array,方便调试查看。

Clone


function clone(ma, mb, _x){
  for(_x in ma){
    if(typeof(ma[_x]) != "array"){
      mb[_x] = ma[_x];
    }else{
      mb[_x][__Y__] = 1;
      clone(ma[_x], mb[_x]);
      delete mb[_x][__Y__];
    }
  }
}

Clone就是一个递归函数,没有什么特别的。为什么要给Awk实现一个Clone函数呢?

因为Awk无法做这样的赋值操作,当map[a]是Array时,b = map[a]会报错,

错误提示为:试图在标量环境中使用数组“map[a]”。这时候我们可以用clone(map[a],b)来替代。

通过用__Y__占位的方式解决多层类型嵌套的问题,clone完后delete掉。