地图文档不够清晰



我试图通过阅读其文档来理解map函数,但无济于事。在文档中它说"Evaluates the BLOCK or EXPR for each element of LIST"但是,如何知道也可以使用文件测试运算符

,如下所示?
map { [$_, -s] } ('perl.c', 'sv.c', 'hv.c', 'av.c');

上述代码的来源是:http://www.stllinux.org/meeting_notes/1997/0918/schwtr.html

所以基本上,结果将是文件的哈希值及其文件大小,但我到底应该如何仅从文档中知道这一点?

你们能帮我了解更多吗?

实际上,它说

地图阻止列表

评估 LIST 的每个元素的块或 EXPR(本地设置 $_ 到每个元素)并返回由结果组成的列表值 每个此类评估。在标量上下文中,返回总数 如此生成的元素。在列表上下文中评估 BLOCK 或 EXPR,因此 LIST 的每个元素都可以在 返回值。

重要的部分是$_本地化为 BLOCK,包含 LIST 中每个元素的值。对于for循环也是如此,即 for (LIST) .

-s函数就像你说的那样是一个文件测试,没有明确的参数,它对$_进行操作。这与许多 Perl 内置函数(例如 printunpackordlength)的默认行为相同。

您显示的代码包含一个标量表达式:[$_, -s] ,这是一个数组 ref,其中包含$_内的文件名以及您所说的大小。

所以,基本上,你在这里看到的是基本的Perl技术。如果还有什么不清楚的地方,请随时询问。

更新:

至于这段代码的具体作用,它可能是施瓦茨变换的一部分,通过该变换,您可以对列表执行更有效的排序,其中排序条件由昂贵的操作组成。例如:

my @files = ('perl.c', 'sv.c', 'hv.c', 'av.c');
my @sorted = sort { -s $a <=> -s $b } @files;     # sorting by file size
对于一个小列表,

这无关紧要,但是对于较大的列表,多次运行文件测试可能不是很有效,因此我们将测试结果缓存在数组 ref 中:

my @sorted = map $_->[0],                    # restore original value
             sort { $a->[1] <=> $b->[1] }    # perform sort on element #2
             map { [ $_, -s ] } @files;      # your map statement

这被称为施瓦茨变换。

最新更新