getline
指定读取“来自当前输入文件”并在文件末尾返回 0。gawk和POSIX文档都使用这种措辞。这是有道理的:数据可能出于某种原因在文件之间分配。如果可以区分文件,语言会更具表现力。结构足够合理的信息通常不会跨越文件边界。getline
getline
但是 GNU 和 macOS/BSD 实现都隐藏了 EOF 并立即打开下一个文件。这样做会更新FILENAME
,而这不在 GNU 或 POSIX 文档中指定受影响的变量列表中。
我看到的唯一解决方法是确保每个文件都以一个一次性的行开头,并检测何时FNR
重置为 1。真恶心。
这两种实现都存在此错误,这真是一个奇怪的巧合。查看源代码,这两种行为都不是疏忽。两者都采取了特定的步骤来推进文件,而不是getline
从命名的 I/O 句柄进行代码分支。冗长的 GNU 文档与此行为相矛盾,这尤其奇怪。
我是不是漏掉了什么?我是不是偶然发现了一个不常见的案例,或者这是 Awk 传说中已知的?