2017-04-19 44 views
0

我有一個目錄中所有文件的列表。我已將它們存儲在變量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」請指引我最後一個值。我想文件

的所有尾值的列表

回答

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 
} 

注意,我們傳遞的變量(tails外)的和使用upvar 1程序內部,使可更新的鏈接的局部變量(theList內)。但是,您無法通過傳遞的值; Tcl使用copy-on-write語義來表示它的值。您需要注意變量名稱和它們包含的值之間的差異;他們不一樣。

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}] 

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