2012-10-28 5 views
0

comment puis-je envoyer ces valeursParamètres TCL en utilisant NS2

24.215729 
24.815729 
25.055134 
27.123499 
27.159186 
28.843474 
28.877798 
28.877798 

Tcl argument d'entrée? comme vous le savez, nous ne pouvons pas utiliser la commande de tuyau parce que tcl dosent accepter de cette façon! que puis-je faire pour stocker ces nombres dans le fichier tcl (le nombre de ces nombres dans la variable et peut être 0 à N et dans cet exemple son 7)

Répondre

2

Ceci est assez facile à faire dans bash, vider la liste des les valeurs dans un fichier, puis exécutez:

tclsh myscript.tcl $(< datafilename) 

et puis les valeurs sont accessibles dans le script avec les variables d'argument:

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

Vous pouvez lire les données à stdin canalisés avec des commandes comme

set data [gets stdin] 

ou à partir de fichiers temporaires, si vous préférez. Par exemple, la première partie du programme suivant (un exemple de wiki.tcl.tk) lit certaines données d'un fichier et l'autre partie lit les données de stdin. Pour le tester, mettre le code dans un fichier (par exemple reading.tcl), le rendre exécutable, créer un petit fichier somefile, et exécuter par exemple

./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

juste pour être clair, 'gets' lit une ligne et supprime le saut de ligne de fuite (de sorte que le nom de la variable' data' est un peu trompeur), et 'read' lit un tas de caractères (y compris les nouvelles lignes). –

+0

@ glenn, à droite, à des fins de la démo, je n'ai pas mentionné ces points. Notez aussi que le '[read stdin $ fsize]' lira au plus $ fsize caractères de stdin (ie lit moins si EOF se produit avant que beaucoup) et $ fsize pourrait bien être indifférent à tout ce qui apparaît sur stdin. –

+0

Si vous voulez tout lire, lisez '$ channel '; Tcl a une bonne gestion de tampon. –

1

Une technique que j'utilise lors du codage est de mettre les données dans mes scripts comme un littéral:

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

maintenant, je peux les intégrer dans une commande un à la fois avec foreach, ou les envoyer comme un seul argument:

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

Une fois que vous avez votre code fonctionnant avec un littéral, le changer pour extraire les données d'un fichier est assez simple. Vous remplacez simplement le littéral avec le code pour lire un fichier:

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

Vous pouvez également extraire les données de stdin:

set values [read stdin] 

S'il y a beaucoup de valeurs (plus que, disons, 10-20MB) alors vous feriez mieux de traiter les données une ligne à la fois. Voici comment faire à la lecture de stdin ...

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