0

我试图通过阅读它的文档来理解地图功能,但无济于事。在文档中它说"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

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

你们能帮我理解更多吗?

4

1 回答 1

10

实际上,它说

地图块列表

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

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

正如您所说,该-s函数是一个文件测试,并且没有明确的参数,它在$_. 这与许多 Perl 的内置函数所具有的默认行为相同,例如print, unpack, ord, length

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

所以,基本上,您在这里看到的是基本的 Perl 技术。如果还有什么不明白的,欢迎追问。

更新:

至于这段代码的具体作用,它可能是Schwartzian transform的一部分,您可以在其中对列表执行更有效的排序,其中排序标准由昂贵的操作组成。例如:

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

这被称为Schwartzian 变换

于 2013-09-10T02:18:56.667 回答