【问题标题】:Perl find min value with custom compare funcitonPerl使用自定义比较功能查找最小值
【发布时间】:2011-08-02 00:08:42
【问题描述】:

除了排序和取第一项之外,有没有办法使用自定义比较函数在数组中找到最小值?

【问题讨论】:

    标签: perl min


    【解决方案1】:

    您可以使用来自List::Utilreduce 创建一个。

    use List::Util qw/reduce/;
    $min = reduce { $a < $b ? $a : $b } 1..10 # regular minimum
    

    如果要比较字符串,例如,将&lt; 替换为le(尽管List::Util 也导出minstr)。

    【讨论】:

    • List::Util 也有min 功能,为什么不直接使用呢?
    • @wk:OP要求自定义比较功能的方法。
    【解决方案2】:

    看起来你想要更高阶的函数,也许,切换到函数式语言?

    不过不用担心,你可以在 perl 中模拟它,或者选择简单的解决方案:

     my $min = shift @yourlist; # or $yourlist[0] if the list must remain intact      
     # assuming that your compare function is named "lower"
     map { $min = $_ if lower($_, min) } @yourlist;
    

    【讨论】:

    • Perl 一种函数式语言。当然不是纯粹的,但它有most of the defining features
    • 为什么要使用地图而不是 for 循环?
    • @daxim - 我知道,认为,句法问题和性能几乎不可能像这样使用它。当然,最大的障碍是它缺乏健全的类型系统——虽然这对函数式语言没有要求,但它确实让函数式编程非常摇滚。不要将此视为反对 Perl 的宣传 - 我自己是一名资深的 perl 黑客,但他看到有时有更好的方法来做某些事情。
    • @Tim:有不止一种方法可以做到这一点,你知道 :) - 在这种特殊情况下,在我看来,功能性解决方案的下一个解决方案是很自然的。或者我最近在 Haskell 上做的太多了,所以我没有想到像循环这样的命令式结构。
    • @Ingo:当然map 也可以,但我认为在这种情况下没有理由需要高阶函数,甚至没有理由让事情变得更简单。 map 的使用似乎与您使用 Haskell 的愿望相同。
    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多