我有一个目录中所有文件的列表。我已将它们存储在变量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”请指导我。我想要一个文件
答案 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}]
文档: foreach, lappend, lmap (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语义。你需要注意变量名称和它们包含的值之间的区别;他们不一样。