【问题标题】:array length fails in awk function bodyawk 函数体中的数组长度失败
【发布时间】:2017-06-14 03:49:51
【问题描述】:

我无权访问其他 awk 版本来检查此问题的一般性。

$ awk --version
GNU Awk 3.1.5

考虑这个简单的测试

$ awk 'function f(x) {x[1]} BEGIN{f(x); print length(x)}'
1

按预期工作,但是在函数体中打印长度失败

$ awk 'function f(x) {x[1]; print length(x)} BEGIN{f(x)}'
awk: fatal: attempt to use array `x (from x)' in a scalar context

在函数体中获取数组长度的唯一方法似乎是计算元素for(i in x) c++

这是受到answer的启发

【问题讨论】:

  • 我对 awk 一点也不熟悉,但 this 可能会有所启发
  • 我在 4.1.1,后者打印 1。
  • 有趣的是这个bug只出现在函数上下文中!
  • @Wondercricket 链接的答案是this commentlength(array) 是(3.1.5 中的新功能),但不在 POSIX 模式下
  • 是的,很好的信息。但是,它在主语句上下文中有效。似乎函数上下文对于长度调用有不同的代码路径。这让我很惊讶……

标签: awk


【解决方案1】:

曾几何时,length() 用于查找字符串中的字符数。然后 gawk 对其进行了修改以查找数组中元素的数量。然后 POSIX 采用了 gawk 方法,今天我们在这里,所有 awk 都兴高采烈地将字符串或数组作为 length() 的参数。

现代 awk 版本中不会发生您所遇到的情况,这是 gawk 3.1.5 和 3.1.6 中的错误,请参阅 https://lists.gnu.org/archive/html/bug-gnu-utils/2008-03/msg00028.html

【讨论】:

  • 是的,这就解释了。
  • 从前 - 没有比这更好的方法了。
猜你喜欢
  • 2016-12-07
  • 2012-03-10
  • 2012-01-06
  • 2013-04-27
  • 2018-10-12
  • 2014-05-23
  • 2021-09-02
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多