如何从tcl的foreach循环中返回值
问题描述:
我有一个目录中所有文件的列表。我已将它们存储在变量file_list
中。我想获取每个文件的尾部名称。我的方法就是这样。如何从tcl的foreach循环中返回值
set file_list [list /a/b/a.txt /a/b/b.txt /a/b/c/file1.tcl /a/b/c/file2.tcl]
proc file_tail {filename} {
set x {}
set f_tail [file tail $filename]
lappend x $f_tail
return $x
}
foreach ft $file_list {
set f_tail [file_tail $ft]
}
但f_tail
只包含存储即“file2.tcl”请指引我最后一个值。我想文件
答
如果你正在所有的尾巴的列表,这样做:
set f_tail {}
foreach ft $file_list {
lappend f_tail [file tail $ft]
}
如果您的辅助函数会做lappend
,你需要保持变量保存的程序之外名单:
proc file_tail {filename listVariable} {
upvar 1 $listVariable theList
set f_tail [file tail $filename]
lappend theList $f_tail
}
set tails {}
foreach ft $file_list {
file_tail $ft tails ; # <<< NAME, so not $tails as that would READ the variable
}
注意,我们传递的变量(tails
外)的名和使用upvar 1
程序内部,使可更新的链接的局部变量(theList
内)。但是,您无法通过传递的值; Tcl使用copy-on-write语义来表示它的值。您需要注意变量名称和它们包含的值之间的差异;他们不一样。
答
我建议要么:
set f_tail {}
foreach ft $file_list {
lappend f_tail [file_tail $ft]
}
或者(如果你有一个Tcl更高版本):
set f_tail [lmap ft $file_list {file_tail $ft}]
文档: foreach, lappend, lmap (for Tcl 8.5), lmap