如何创建一个空数组

时间:2011-10-19 14:00:16

标签: lint gawk

更新

下面的原始描述有很多错误; 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]; }

2 个答案:

答案 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 / threadsthreads_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