Perl sort损坏bsd_glob结果[重复]

问题描述 投票:0回答:2

这是真正简单的案例。

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 函数,并使其表现为找不到文件?

perl glob
2个回答
2
投票

你无意中使用了

sort SUBNAME LIST

句法,告诉 sort 使用 bsd_glob 作为比较函数。

你可以明确指定比较函数

sort { $a cmp $b } bsd_glob "*.wav"

你可以避免省略操作数和参数周围的小括号。

 sort(bsd_glob(*.wav"))

省略操作数和参数周围的小括号会导致奇怪的错误。


3
投票

当你说

sort bsd_glob $pattern;

那么 bsd_glob 被用作排序(比较)函数,用的是 $pattern tnen是要排序的列表(尽管在模式周围使用了括号)。

最快的变通方法是

sort +bsd_glob $pattern;

其中单数 + 使下列(bsd_glob)作为一个表达式处理,在这种情况下,它不能成为一个排序函数。那么默认的 { $a cmp $b } 排序,如期使用。

或者,在要排序的列表周围使用另一组parens。(bsd_glob(...)). 见 此职位 以了解详情,以及其中的链接。

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