如何从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}] 

文档: foreachlappend, lmap (for Tcl 8.5), lmap