2010-04-06 63 views
2

我試圖用數組中的變量值替換,以便根據命令行輸入更新數組值。 例如我正在接收IP地址作爲我的TCL腳本的命令行參數,並嘗試使用recvd IP值更新命令。基於命令行參數的TCL數組值更新

我的陣列是:

array set myArr { 1 myCmd1("192.268.2.1","abc.txt") 
        2 myCmd2("192.268.2.1","xyz.txt") 
        3 myCmd3("192.268.2.1","klm.txt") 
       } 

這裏, 「192.268.2.1」 實際上將被作爲命令行參數提供。

我試着做

array set myArr { 1 myCmd1($myIP,"abc.txt") 
        2 myCmd2($myIP,"xyz.txt") 
        3 myCmd3($myIP,"klm.txt") 
       } 

和像${myIP}{[set $myIP]}其他組合,但沒有工作。

在此先感謝您的幫助/投入。

回答

-1

嘗試:

array set myArr [list myCmd1($myIP, "abc.txt") 2 myCmd2($myIP, "xyz.txt") ... ] 

爲什麼?因爲當你在Tcl中編寫{$var}時,這意味着$var而不是變量var的內容。如果您使用list創建列表而不是大括號,則仍會評估變量。

+1

這比有點破。引用的位「(abc.txt)」在(多個元素?)和(解析錯誤!)之後有一個空格。 – 2010-04-07 08:13:11

3

使用list命令

% set myIP 0.0.0.0 
0.0.0.0 
% array set myArr [list 1 myCmd1($myIP,"abc.txt") 2 myCmd2($myIP,"xyz.txt") 3 myCmd3($myIP,"klm.txt")] 
% puts $myArr(1) 
myCmd1(0.0.0.0,"abc.txt") 
% puts $myArr(3) 
myCmd3(0.0.0.0,"klm.txt") 
% 
1

我覺得你的代碼會更容易理解,更容易維護,如果你不嘗試使用數組在這種情況下設置。如果你非常小心的話,你可以避開它(見與使用列表有關的答案),但當存在更可讀的解決方案時,沒有理由這樣做。

這裏是我的解決方案:

set myArr(1) "myCmd1($myIP,\"abc.txt\")" 
set myArr(2) "myCmd2($myIP,\"xyz.txt\")" 
set myArr(3) "myCmd3($myIP,\"klm.txt\")"