【发布时间】:2022-11-28 18:21:07
【问题描述】:
如果我们假设循环首先返回 k==0(根据规范,此顺序取决于实现)。循环体应该运行多少次?一次还是两次?如果两次应该为 arr[1] 打印什么?
BEGIN {
arr[0] = "zero";
arr[1] = "one";
for (k in arr) {
print "key " k " val " arr[k];
delete arr[k+1]
}
}
$ gawk --version
GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0, GNU MP 6.2.1)
....
$ gawk 'BEGIN { arr[0] = "zero"; arr[1] = "one"; for (k in arr) { print "key " k " val " arr[k]; delete arr[k+1] } }'
key 0 val zero
key 1 val
$ goawk --version
v1.19.0
$ goawk 'BEGIN { arr[0] = "zero"; arr[1] = "one"; for (k in arr) { print "key " k " val "
key 0 val zero
gnu-awk 使用arr[1] == "" 运行它两次,而 goawk 运行它一次。 Mawk(mawk 1.3.4 20200120)对键 1,0 进行排序,但具有与 gnu-awk 相同的基本行为,循环两次并为删除的键打印空字符串)。该程序的 posix 定义预期行为是什么?
本质上,在过去的循环中删除的键是否应该出现在未来的循环中?
【问题讨论】:
-
我不希望有一个不是外部强制执行的一致顺序,比如以整数为键的 for 循环。在 gawk 中,您可以使用“asort”和“asorti”,而不是构建您自己的订单执行代码。我大麦触摸其他人,所以有人必须为他们插话。
-
@tomc 这不是问题。问题是假设如果循环执行两次(即使键 1 在迭代 0 中被删除),键以 0、1 的顺序出现。
-
对我来说听起来像是未定义的行为。你为什么认为有这方面的规范?
-
@tripleee 这对我来说似乎很合理。我希望听到它是或不是的争论,或者可能是指向我错过的规范的某些部分的链接。
-
似乎您认为循环应该重新评估数组条件,例如每次迭代的长度,而不是在循环开始时只评估一次。