如果从函数调用,函数不具有相同的行为

时间:2016-04-04 09:48:54

标签: awk

我编写了一个小函数,使用bc将十六进制数转换为十进制数。直接调用时,它可以工作,但是当从另一个函数中的单个语句多次调用时,它会失败。

这是一个重现问题的演示脚本:

awk 'function hd(h) {
  cmd=sprintf("echo \"ibase=16; obase=A; %s\"|bc", h);
  cmd|getline d;
  printf("hd(%s)=%s\n", h, d);
  return d;
}
function test() {
  printf("A=%d, FF=%d\n", hd("A"), hd("FF"));
}
BEGIN {
  printf("A=%d, FF=%d\n", hd("A"), hd("FF"));
  test();
}'

以下是此输出:

hd(A)=10
hd(FF)=255
A=10, FF=255
hd(A)=255
hd(FF)=255
A=255, FF=255

如您所见,直接在BEGIN执行时,它可以正常工作;但是当通过test()函数执行时,它会失败。

我正在使用GNU Awk 3.1.5。我也在另一台机器上尝试过GNU Awk 4.1.1,它也以类似的方式失败了。

1 个答案:

答案 0 :(得分:2)

问题是,您没有在cmd|getline d之后关闭管道。

添加

close(cmd)
<{1>} getline应该解决您的问题。 getline应谨慎使用。

P.S。 awk中的printf是一个声明,而不是一个函数。