我采集了一个图片列表,像这样存放文件夹里。
foreach image [lsort [glob -nocomplain -directory $image_path -type f *]] {
puts $image
}
所有的图片都是按顺序排列的,因为... lsort
但有几张图片根本就没有排序,我一直想不明白为什么。
文件夹返回的顺序是
Repository/Unsorted/3.jpg
Repository/Unsorted/30.jpg
Repository/Unsorted/33.jpg
Repository/Unsorted/6.jpg
Repository/Unsorted/9.jpg
预计:
Repository/Unsorted/3.jpg
Repository/Unsorted/6.jpg
Repository/Unsorted/9.jpg
Repository/Unsorted/30.jpg
Repository/Unsorted/33.jpg
最新情况:当我使用 -dictionary
切换它返回正确的顺序。谁能详细说明一下原因?
foreach image [lsort -dictionary [glob -nocomplain -directory $image_path -type f *]] {
puts $image
}
该 lsort
命令有几种方式可以决定元素的排序。
-ascii
(默认模式由于各种原因,命名略微有些错误)只是使用两个字符串中每一对字符的数字排序,按照字符串中字符的顺序排列。这就是你所期望的那种与 C strcmp()
... 如果是Unicode-aware的话。
-dictionary
是一样的......除了字符串中的数字序列(所以只有字符)。0
通过 9
; 不 -
所以没有负数)作为数字进行比较。这给人的感觉更像在字典中得到的排序;它是专门为了在Tk的文件选择对话框中产生一个令人愉悦的文件名顺序。
而且,为了完整性。-integer
和 -real
分别将字符串解析为整数和浮点数,然后进行排序,以及 -command
让你提供自己的排序命令(速度较慢,但完全可以控制)。
Tcl之所以知道值的排序顺序,是因为你告诉它。
因此,当比较 Repository/Unsorted/3.jpg
和 Repository/Unsorted/30.jpg
,在 -ascii
俨然 .
(Unicode U+00002E)之前的是 0
(Unicode U+000030),而在 -dictionary
俨然 3
和 30
数字序列被解析为整数,并以这种方式进行比较(因为之前的非数字部分是相同的)。