2011-10-19 73 views
0

UPDATE如何創建一個空數組

下面的原始描述有許多錯誤; gawk lint不會抱怨用作RHS in的未初始化數組。例如,以下示例不提供任何錯誤或警告。我並沒有刪除這個問題,因爲我接受的答案提供了使用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導致

warning: reference to uninitialized variable `thread_start'

所以我在BEGIN塊中初始化如下。但是這看起來很糟糕。有沒有更優雅的方式來創建一個零元素數組?

BEGIN { LINT = 1; thread_start[0] = 0; delete thread_start[0]; } 
+0

不是我所知道的。 –

回答

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 a value用它在threads_start搜索之前通過掉毛:

BEGIN{ 
    LINT = "fatal"; 
    thread = 0; 
    if (thread in threads_start) { 
     print "if"; 
    } else { 
     print "not if"; 
    } 
} 

生產:

not if

要與未初始化數組來創建一個掉毛的錯誤,我們需要嘗試訪問一個不存在的條目:

BEGIN{ 
    LINT = "fatal"; 
    thread = 0; 
    if (threads_start[thread]) { 
     print "if"; 
    } else { 
     print "not if"; 
    } 
} 

生產:

gawk: cmd. line:4: fatal: reference to uninitialized element `threads_start["0"]'

所以,你真的不需要創造awk中一個空數組,但如果你想這樣做,並回答你的問題,使用split()

BEGIN{ 
    LINT = "fatal"; 
    thread = 0; 
    split("", threads_start); 
    if (thread in threads_start) { 
     print "if"; 
    } else { 
     print "not if"; 
    } 
} 

產生:

not if

+0

謝謝你讓我回到這個愚蠢的問題。感謝您忽略錯誤並仍然提供有用的答案。 –

1

我想你可能在你的代碼中犯了一些錯字。

if (thread in threads_start) { // LINT warning here (you think) 

在這裏,您在陣列threads_start查找指數thread

printf("%s started at %d\n", threads[thread_start])); // Actual LINT warning 

但在這裏您打印索引thread_start數組threads!另外請注意不同的sthread/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警告嗎?

+0

不少,錯別字太多。讓我試着再解決它。 –