Question

how can i sent this values

24.215729
24.815729
25.055134
27.123499
27.159186
28.843474
28.877798
28.877798

to tcl input argument? as you know we cant use pipe command because tcl dosent accept in that way! what can i do to store this numbers in tcl file(the count of this numbers in variable and can be 0 to N and in this example its 7)

Was it helpful?

Solution

This is pretty easy to do in bash, dump the list of values into a file and then run:

tclsh myscript.tcl $(< datafilename)

And then the values are accessible in the script with the argument variables:

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

OTHER TIPS

You can read data piped to stdin with commands like

set data [gets stdin]

or from temporary files, if you prefer. For example, the following program's first part (an example from wiki.tcl.tk) reads some data from a file, and the other part then reads data from stdin. To test it, put the code into a file (eg reading.tcl), make it executable, create a small file somefile, and execute via eg

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

A technique I use when coding is to put data in my scripts as a literal:

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

Now I can just feed them into a command one at a time with foreach, or send them as a single argument:

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

Once you've got your code working with a literal, switching it to pull the data from a file is pretty simple. You just replace the literal with code to read a file:

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

You can also pull the data from stdin:

set values [read stdin]

If there's a lot of values (more than, say, 10–20MB) then you might be better off processing the data one line at a time. Here's how to do that with reading from stdin…

while {[gets stdin v] >= 0} {
    TheCommand $v
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top