2012-10-28 30 views
0

我怎麼能發送這個值參數使用NS2

24.215729 
24.815729 
25.055134 
27.123499 
27.159186 
28.843474 
28.877798 
28.877798 

到TCL輸入參數?你知道我們不能使用管道命令,因爲tcl dosent以這種方式接受! 我能做些什麼來存儲這個數字在tcl文件中(這個數字的數量在變量中,可以是0到N,在這個例子中是7)

回答

2

這是很容易做在bash中,轉儲清單值到一個文件,然後運行:

tclsh myscript.tcl $(< datafilename) 

然後該值在腳本訪問與參數變量:

puts $argc; # This is a count of all values 
puts $argv; # This is a list containing all the arguments 
1

您可以閱讀管道輸送到stdin與命令一樣

數據
set data [gets stdin] 

或臨時文件,如果你喜歡。例如,以下程序的第一部分(來自wiki.tcl.tk的示例)從文件讀取一些數據,然後另一部分從stdin讀取數據。爲了測試它,把代碼放到一個文件(例如:reading.tcl),使其可執行文件,創建一個小文件somefile,並執行經例如

./reading.tcl < somefile 


#!/usr/bin/tclsh 
# Slurp up a data file 
set fsize [file size "somefile"] 
set fp [open "somefile" r] 
set data [read $fp $fsize] 
close $fp 
puts "Here is file contents:" 
puts $data 

puts "\nHere is from stdin:" 
set momo [read stdin $fsize] 
puts $momo 
+0

僅僅是明確的,'gets'讀取一行,並刪除其後的換行符(所以變量名'data'是有點誤導)和'read'讀取一堆字符(包括換行符)。 –

+0

@glenn,對於演示的目的,我沒有提到這些要點。還要注意,'[read stdin $ fsize]'會從標準輸入讀取至多$ fsize字符(即,如果EOF出現在許多之前,則讀取更少),並且$ fsize很可能與標準輸入中出現的任何內容無關。 –

+0

如果您要閱讀所有內容,只需閱讀$ channel; Tcl的緩衝區管理很好。 –

1

編碼,當我使用的技術是把數據在我的腳本,文字:

set values { 
    24.215729 
    24.815729 
    25.055134 
    27.123499 
    27.159186 
    28.843474 
    28.877798 
    28.877798 
} 

現在我可以只給它們放入一個命令一次一個與foreach,或送他們作爲一個參數:

# One argument 
TheCommand $values 
# Iterating 
foreach v $values { 
    TheCommand $v 
} 

一旦你得到了你的代碼與文字工作,切換它從文件中提取數據是非常簡單的。您只需更換文字的代碼讀取文件:

set f [open "the/data.txt"] 
set values [read $f] 
close $f 

您也可以從標準輸入提取數據:

set values [read stdin] 

如果有很多的值(大於,比如說,10-20MB ),那麼你一次處理一行數據可能會更好。以下是如何做到這一點從標準輸入讀取...

while {[gets stdin v] >= 0} { 
    TheCommand $v 
}