awk函数体中的数组长度失败

awk函数体中的数组长度失败,awk,Awk,我无法访问其他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)'

我无法访问其他
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
获取函数体中数组长度的唯一方法似乎是计算(i in x)c++


这是受此启发的。

从前,
length()
用于查找字符串中的字符数。然后,gawk对其进行了修改,以同时查找数组中的元素数。然后POSIX采用了gawk方法,今天我们所有的AWK都很高兴地将字符串或数组作为length()的参数


你所经历的并不是现代awk版本中发生的,它是gawk 3.1.5和3.1.6中的一个bug,请参见

我对awk一点也不熟悉,但可能会透露一些信息。我在4.1.1上,后者打印1。有趣的是,这个bug只出现在函数上下文中!根据@Wondercricket链接的答案是:长度(数组)是(3.1.5中新增),但不是POSIX模式是,好信息。但是,它在主语句上下文中工作。似乎函数上下文对于长度调用有不同的代码路径。这让我很惊讶……是的,这就解释了。很久以前,没有更好的开始方式了。