如何在tcl中返回foreach循环中的值

时间:2017-04-19 13:17:30

标签: foreach tcl

我有一个目录中所有文件的列表。我已将它们存储在变量file_list中。我想得到每个文件的尾部名称。我的方法是这样的。

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”请指导我。我想要一个文件

的所有尾值的列表

2 个答案:

答案 0 :(得分:1)

我建议:

set f_tail {}
foreach ft $file_list {
    lappend f_tail [file_tail $ft]
}

或(如果您有更高版本的Tcl):

set f_tail [lmap ft $file_list {file_tail $ft}]

文档: foreachlappendlmap (for Tcl 8.5)lmap

答案 1 :(得分:0)

如果要列出所有尾巴,请执行以下操作:

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
}

请注意,我们传入变量(<{1}}外部)的名称并在过程中使用tails来创建链接的局部变量({{1} } inside)可以更新。但是,您无法通过传递列表来执行此操作; Tcl对其值使用copy-on-write语义。你需要注意变量名称和它们包含的值之间的区别;他们不一样。