这是真正简单的案例。
use feature qw/say/;
use File::Glob qw/bsd_glob/;
# got many wav files
say foreach bsd_glob "*.wav";
# got "*.wav" as only result
say foreach sort bsd_glob "*.wav";
say foreach sort bsd_glob("*.wav");
为什么?sort
关键词对 bsd_glob
函数,并使其表现为找不到文件?
你无意中使用了
sort SUBNAME LIST
句法,告诉 sort
使用 bsd_glob
作为比较函数。
你可以明确指定比较函数
sort { $a cmp $b } bsd_glob "*.wav"
你可以避免省略操作数和参数周围的小括号。
sort(bsd_glob(*.wav"))
省略操作数和参数周围的小括号会导致奇怪的错误。
当你说
sort bsd_glob $pattern;
那么 bsd_glob
被用作排序(比较)函数,用的是 $pattern
tnen是要排序的列表(尽管在模式周围使用了括号)。
最快的变通方法是
sort +bsd_glob $pattern;
其中单数 +
使下列(bsd_glob
)作为一个表达式处理,在这种情况下,它不能成为一个排序函数。那么默认的 { $a cmp $b }
排序,如期使用。
或者,在要排序的列表周围使用另一组parens。(bsd_glob(...))
. 见 此职位 以了解详情,以及其中的链接。