在 perl 中对两个元素使用 "map()" 有什么意义?

What's the point of using "map()" for two elements in perl?

我看到代码中只有两个相当静态的元素要映射,例如具有开始日期和结束日期的时间间隔,但使用 map() 而不是显式映射代码,例如

{ map { ... } qw(start end) }   # vs.
{ start => ..., end => ... }

哪种方式更可取,为什么?

map 形式可能不那么简洁但看起来更实用(如在函数式编程中),所以我想这就是为什么它可能比显式代码更受欢迎并且可能更干。

然而,它看起来不太清晰,因为背后有更多的逻辑,映射也应该效率较低,因为它调用调用 a 并由更多的原子操作组成。

编辑
编程中有一个相互矛盾的目标:KISS(保持它{从中选择2:小,简单,愚蠢})。使用 map 会使代码稍微复杂一些。

假设您不只是将两个项目设置为相同的常量或类似微不足道的东西,我希望 map 版本 简洁。

IMO,支持 map 版本的主要观点是您知道将使用相同的过程来生成两个值。不仅是为了 DRY,还因为它消除了任何一个人可能有细微变化而另一个人没有的担忧。

至于性能问题...如果您的用例对性能足够敏感以致于任何潜在差异都很重要,那么您一开始就不应该使用 Perl。切换到编写良好的 C(不是 C#,不是 C++,不是 Objective C - 只是普通的 C)将比微优化更大的性能影响,无论您是单独分配两个值还是使用循环来设置它们。但是无论如何,您的用例如此敏感的可能性几乎为零。

有一个编码原则称为DRY。不要重复自己。

它断言:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

这可以解释为压缩重复输入(例如)map/for

当我试图扩展一些文本时,我使用的习语就像你引用的那样 - 例如:

 my @defs = map { "DEF:$_=$source_file:$_:MAX" } qw ( read write ); 

这为我生成了一些 rrdtool 的 DEF 行。

我这样做是因为对于 一些 案例,我有相当长的 'things I want to define' 列表并且希望保持一致。 (有时我会说,10 条相似的线只相差一个字)。

还因为:

my @defs = ( "DEF:read=$source_file:read:MAX",
             "DEF:write=$source_file:write:MAX" ); 

两个元素的内容并不多,我认为这与风格问题一样重要。但是,如果您拥有的不止于此,它很快就会变得非常有用,因为您可以更改 单行 行 - 假设您有不同的文件位置?想要将 MAX 换成 AVERAGE?

当查看一长串类似的语句时,'punctuation blind' 也非常容易,有人打错了字,在应该是 . 的地方添加了 , 或相似的。

而且...您可能不会在可读性方面损失太多。但是会承认这是一个风格点,因为虽然 map 非常惊人,但如果您不小心,它 可以 使一些代码很难阅读。

另外要具体地址:

mapping should also be less efficient because it invokes calls a and consists of more atomic operations.

一个wise man曾经说过:

premature optimization is the root of all evil

不要考虑语句的效率——看看legibility/readability。编译器非常聪明。大多数 "obvious" 优化,它们已经为您完成。处理器也相当快。 大多数 代码中的限制因素不是您需要的CPU 周期数,而是IO 吞吐量和内存占用量。所以不用担心 - 编写清晰的代码。

如果您的代码对性能有关键需求,您应该使用代码分析器来查看您在重构工作中获得最高效率的地方。这样做(有时)您最终可能会得到不太清晰的代码,但这是一个更明确的权衡。