更新
下面的原始描述有很多错误; gawk lint没有抱怨用作in
的RHS的未初始化数组。例如,以下示例未提供任何错误或警告。我没有删除这个问题,因为我要接受的答案给出了使用split
和空字符串来创建空数组的好建议。
BEGIN{
LINT = "fatal";
// print x; // LINT gives error if this is uncommented
thread = 0;
if (thread in threads_start) {
print "if";
} else {
print "not if";
}
}
原始问题
我的许多awk脚本都有如下构造:
if (thread in threads_start) { // LINT warning here
printf("%s started at %d\n", threads[thread_start]));
} else {
printf("%s started at unknown\n");
}
gawk --lint
导致
警告:引用未初始化的变量`thread_start'
所以我在BEGIN块中初始化如下。但这看起来像kludge-y。有没有更优雅的方法来创建零元素数组?
BEGIN { LINT = 1; thread_start[0] = 0; delete thread_start[0]; }
答案 0 :(得分:1)
我想你可能在你的代码中犯了一些错字。
if (thread in threads_start) { // LINT warning here (you think)
在这里,您可以在数组thread
中查找索引threads_start
。
printf("%s started at %d\n", threads[thread_start])); // Actual LINT warning
但是你在这里打印数组thread_start
中的索引threads
!另请注意不同的 s 的thread
/ threads
和threads_start
/ thread_start
。 Gawk实际上正在警告你第二行thread_start
(没有s)的用法。
您的printf
格式也存在错误。
更改这些时,棉绒警告消失:
if (thread in threads_start) {
printf("%s started at %d\n", thread, threads_start[thread]));
} else {
printf("%s started at unknown\n");
}
但也许我误解了你的代码应该做什么。在这种情况下,您是否可以发布一个产生虚假lint警告的最小自包含代码示例?
答案 1 :(得分:0)
<强>摘要强>
creating an empty array in Awk的惯用方法是使用split()
。
<强>详情
为了简化上面的示例以关注您的问题而不是拼写错误,可以通过以下方式触发致命错误:
BEGIN{
LINT = "fatal";
if (thread in threads_start) {
print "if";
} else {
print "not if";
}
}
会产生以下错误:
gawk: cmd. line:3: fatal: reference to uninitialized variable `thread'
在使用thread
之前使用threads_start
来搜索BEGIN{
LINT = "fatal";
thread = 0;
if (thread in threads_start) {
print "if";
} else {
print "not if";
}
}
次传递linting:
not if
产生
BEGIN{
LINT = "fatal";
thread = 0;
if (threads_start[thread]) {
print "if";
} else {
print "not if";
}
}
要使用未初始化的数组创建linting错误,我们需要尝试访问不存在的条目:
gawk: cmd. line:4: fatal: reference to uninitialized element `threads_start["0"]'
产生
split()
所以,你真的需要在Awk中创建一个空数组,但如果你希望这样做,并回答你的问题,请使用{{1 }}:
BEGIN{
LINT = "fatal";
thread = 0;
split("", threads_start);
if (thread in threads_start) {
print "if";
} else {
print "not if";
}
}
产生
not if