什么';“这就是使用”的意义所在;映射();对于perl中的两个元素?

什么';“这就是使用”的意义所在;映射();对于perl中的两个元素?,perl,map-function,Perl,Map Function,我见过这样的代码,其中只有两个相当静态的元素需要映射,例如带有开始日期和结束日期的时间间隔,但是映射使用的是map(),而不是显式的代码,例如 {map{…}qw(开始-结束)}vs。 {start=>…,end=>…} 哪种方式更可取,为什么 map表单可能不那么简洁,但看起来更具功能性(如在函数式编程中),因此我想这就是为什么它可能比显式代码更受欢迎,而且可能更枯燥 然而,在我看来,它看起来不那么清晰,因为后面有更多的逻辑在进行,而映射的效率也应该更低,因为它调用了调用,并且包含了更多的原

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

{map{…}qw(开始-结束)}vs。
{start=>…,end=>…}
哪种方式更可取,为什么

map
表单可能不那么简洁,但看起来更具功能性(如在函数式编程中),因此我想这就是为什么它可能比显式代码更受欢迎,而且可能更枯燥

然而,在我看来,它看起来不那么清晰,因为后面有更多的逻辑在进行,而映射的效率也应该更低,因为它调用了调用,并且包含了更多的原子操作

编辑

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

假设您不只是将两项设置为相同的常量或类似的琐碎内容,我希望
map
版本更简洁

在我看来,支持
map
版本的要点是,您知道相同的过程将用于生成这两个值。不仅是为了干燥,还因为它消除了任何一方可能会有另一方没有的微妙变化的担忧


至于性能问题。。。如果您的用例对性能足够敏感,任何潜在的差异都很重要,那么您首先就不应该使用Perl。切换到写得好的C(不是C,不是C++,不是客观C——只是普通C)将比微优化有更大的性能影响,无论是单独分配两个值,还是使用循环设置它们。但是,您的用例如此敏感的可能性无论如何大约为零。

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

它声称:

在一个系统中,每一项知识都必须有一个单一的、明确的、权威的表示

这可以解释为使用映射/
for
压缩重复键入

当我试图展开某些文本时,我会使用您所引用的习惯用法,例如:

 my @defs = map { "DEF:$_=$source_file:$_:MAX" } qw ( read write ); 
这将为
rrdtool
生成一些DEF行

我是这样做的,因为在某些情况下,我有相当长的“我想定义的事情”列表,并希望保持一致。(有时我会说,10行相似的行,只有一个单词不同)

但也因为:

my @defs = ( "DEF:read=$source_file:read:MAX",
             "DEF:write=$source_file:write:MAX" ); 
这两个元素没有太多,我认为这是一个风格问题。但是,如果您有更多的内容,它很快就会变得非常有用,因为您可以更改单行,比如您有一个不同的文件位置?想用最大值替换平均值吗

当看到一长串类似的语句时,“标点符号盲”也非常容易,在这些语句中,有人键入并添加了一个
,在应该是
或类似的地方

而且。。。在可读性方面,您可能不会损失太多。但我会承认这是一个风格点,因为虽然
map
非常令人惊讶,但如果你不小心的话,它可能会导致一些相当难以阅读的代码

还特别提到:

映射的效率也应该较低,因为它调用调用,并且包含更多的原子操作

有一句话曾经说过:

过早优化是万恶之源

不要考虑一个陈述的效率——看它的易读性。编译器非常聪明。最“明显”的优化,他们已经为你做了。处理器也相当快。大多数代码中的限制因素不是所需的CPU周期量,而是IO吞吐量和内存占用。所以不要担心,写清晰的代码


如果对代码有一个性能关键的需求,那么您应该使用一个代码探查器来查看在重构过程中您从哪里获得了最大的效率。这样做可能会导致代码不太清晰(有时),但这是一个更清晰的权衡

DRY可能非常有价值,作者可能在易读性问题上不同意您的观点,任何性能差异都可以忽略不计,尤其是在只有两个元素的情况下也可能相关:“过早优化是万恶之源”-是的,但这并不意味着大多数人认为这意味着什么。这并不意味着忽视明显的、低挂起的优化成果,但你不应该考虑太多如何优化,例如,系统或架构过早地针对可能过时的场景进行优化,并购买技术债务。但没错,有两个要素足够简单,以至于无关紧要,尽管我担心应用反效率模式,这可能会在以后建议在重要的地方使用它。我的观点是-担心
map
是否比静态分配更有效。最有可能的是,这将永远不会是一个问题,所以从这个角度来说,不值得担心。