Perl 地图文档不够清晰

Perl 地图文档不够清晰,perl,Perl,我试图通过阅读map函数的文档来理解它,但没有结果。 在文档中,它说“为列表的每个元素计算块或表达式” 然而,人们如何知道也可以使用如下所示的文件测试操作符呢 map { [$_, -s] } ('perl.c', 'sv.c', 'hv.c', 'av.c'); 上述代码的来源是: 因此,基本上,结果将是文件的散列及其大小,但我究竟如何从文档中了解这一点 你们能帮我了解更多吗?事实上,上面说 地图块列表 为列表(本地设置)的每个元素计算块或表达式 $u到每个元素),并返回由结果组成的列表值

我试图通过阅读map函数的文档来理解它,但没有结果。 在文档中,它说
“为列表的每个元素计算块或表达式”
然而,人们如何知道也可以使用如下所示的文件测试操作符呢

map { [$_, -s] } ('perl.c', 'sv.c', 'hv.c', 'av.c');
上述代码的来源是:

因此,基本上,结果将是文件的散列及其大小,但我究竟如何从文档中了解这一点

你们能帮我了解更多吗?

事实上,上面说

地图块列表 为列表(本地设置)的每个元素计算块或表达式 $u到每个元素),并返回由结果组成的列表值 每一个这样的评价。在标量上下文中,返回总数 这样产生的元素的数量。在列表上下文中计算BLOCK或EXPR,因此 列表中的每个元素可以在列表中生成零个、一个或多个元素 返回值

重要的一点是,
$\u
被本地化到块,包含列表中每个元素的值。对于
for
循环,即
for(LIST)
,情况大致相同

-s
函数正如您所说的是一个文件测试,在没有显式参数的情况下,它对
$\uu
进行操作。这与许多Perl内置函数的默认行为相同,例如
print
unpack
ord
length

您正在显示的代码包含一个标量表达式:
[$\uS]
,它是一个数组引用,包含
$\uU
中的文件名及其大小

因此,基本上,您在这里看到的是基本的Perl技术。如果还有什么不清楚的地方,尽管问

更新:

至于这段代码具体做了什么,它可能是一个函数的一部分,在这个函数中,您可以对列表执行更有效的排序,其中排序条件包含一个昂贵的操作。例如:

my @files = ('perl.c', 'sv.c', 'hv.c', 'av.c');
my @sorted = sort { -s $a <=> -s $b } @files;     # sorting by file size
my@files=('perl.c','sv.c','hv.c','av.c');
my@sorted=sort{-s$a-s$b}@files;#按文件大小排序
对于较小的列表,这无关紧要,但对于较大的列表,多次运行文件测试可能不是非常有效,因此我们将测试结果缓存在数组引用中:

my @sorted = map $_->[0],                    # restore original value
             sort { $a->[1] <=> $b->[1] }    # perform sort on element #2
             map { [ $_, -s ] } @files;      # your map statement
my@sorted=map$->[0],#还原原始值
排序{$a->[1]$b->[1]}#对元素#2执行排序
映射{[$\uS]}@files;#你的地图声明

这就是所谓的。

不是文件的散列。此代码生成数组引用的列表。如果丢失,请查看匿名数组。虽然如果从块中返回数组而不是arrayref,您可以返回文件名到大小映射的散列,并将其分配给散列。@edi_allen,是的,我应该声明数组引用,我在深夜写了我的问题。现在这更有意义了,但您如何知道该表达式[$\uS]会像它那样工作吗?这些内置函数的工作方式是:$filesize=-s$filename;我想问题是,人们怎么会知道-s函数在array ref中的工作方式与上面示例中的正常工作方式相反。您知道的方式是查阅手册。:)“如果省略了参数,则测试$…”@david:并不是每个人都像使用默认参数那样大量使用
$\
,因为当提供参数时,更容易看到代码在做什么(即使代码中不需要
-s$
)。尽管它仍然是一种有效的样式选择,但真正大量使用隐式
$\uu
并不常见,正是因为它使您需要了解默认行为或查看手册。@NeilSlater我不理解这种想法。如果我不知道
-s
做什么,那么我会知道
-s$file
做什么吗?如果我知道
-s
是一个文件测试,那么我会不会不知道它是在一个文件上运行的,并且Perl中的所有其他函数在没有参数的情况下都使用
$\uucode>?我认为在这样一个有限的范围内,使用隐式
$\uu
相当好看。例如,
比如说@list
,或者
@dirs=grep-d,@files
@TLP:我个人可能会在代码中使用显式的
[$.-s$.]
,但我很乐意看到压缩版本。“思考”(或者更准确地说是“猜测”)实际上是,许多开发人员将有2秒钟的停顿来回忆Perl默认设置的知识,即使他们知道
-s
的功能,以及
$\ucode>的神奇用法。在问题中这样一个整洁的小地图上,这并不是什么大不了的事情,但是在实践中,您不会在更长的代码中看到它,即使它可以工作。我通常看不到
打印在“好玩的”代码之外独自坐着。