lsort不能正确地对文件名进行排序。

问题描述 投票:1回答:1

我采集了一个图片列表,像这样存放文件夹里。

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
}
tcl glob
1个回答
0
投票

lsort 命令有几种方式可以决定元素的排序。

  • -ascii (默认模式由于各种原因,命名略微有些错误)只是使用两个字符串中每一对字符的数字排序,按照字符串中字符的顺序排列。这就是你所期望的那种与 C strcmp()... 如果是Unicode-aware的话。

  • -dictionary 是一样的......除了字符串中的数字序列(所以只有字符)。0 通过 9; - 所以没有负数)作为数字进行比较。这给人的感觉更像在字典中得到的排序;它是专门为了在Tk的文件选择对话框中产生一个令人愉悦的文件名顺序。

  • 而且,为了完整性。-integer-real 分别将字符串解析为整数和浮点数,然后进行排序,以及 -command 让你提供自己的排序命令(速度较慢,但完全可以控制)。

Tcl之所以知道值的排序顺序,是因为你告诉它。

因此,当比较 Repository/Unsorted/3.jpgRepository/Unsorted/30.jpg,在 -ascii 俨然 . (Unicode U+00002E)之前的是 0 (Unicode U+000030),而在 -dictionary 俨然 330 数字序列被解析为整数,并以这种方式进行比较(因为之前的非数字部分是相同的)。

© www.soinside.com 2019 - 2024. All rights reserved.