longest_string в CPAN? - PullRequest
       0

longest_string в CPAN?

2 голосов
/ 13 июня 2011

На этой странице SO показано, как найти самую длинную строку в массиве.

Доступна ли эта функция в модуле CPAN, например, как longest_string?Кажется странным, что приходится дублировать этот бит кода.Также выглядит как обычно полезная подпрограмма.

Для сравнения, вот SO страница , обсуждающая, как это сделать в Python.

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Я не согласен.Нахождение самой длинной строки тривиально для реализации и не так часто необходимо.Во всяком случае, более общая функция, вероятно, могла бы пробиться в (я полагаю) List::MoreUtils.Например:

my $longest = find_max { length } @array;

, где find_max имеет прототип (&@) и реализует алгоритм из связанного поста.

3 голосов
/ 13 июня 2011

Я подозреваю, что вы обнаружите, что CPAN больше подходит для существенных фрагментов кода (т. Е. Для более чем одной строки).

Я, например, предпочел бы, чтобы CPAN решил мои большие проблемы, такие как доступ к базе данных или различные численные методы и структуры данных.

1 голос
/ 15 июня 2011

ПОЛНОСТЬЮ решения Perl 6 - это просто:

my $longest = @list_of_strings.max: *.chars

Модуль не требуется: -)

0 голосов
/ 13 июня 2011

Обратите внимание на описание List::MoreUtils:

List :: MoreUtils предоставляет некоторые тривиальные, но обычно необходимые функции для списков, которые не будут идти в List :: Util.

Sub minmax в List :: MoreUtils будет работать, но сравнивать числовые значения вместо длин строк.Однако minmax можно довольно легко адаптировать для сравнения длин аргументов.

sub minmax_stringlength (@) {
    return unless @_;
    my $min = my $max = $_[0];

    for ( my $i = 1; $i < @_; $i += 2 ) {
        if ( length($_[$i-1]) <= length($_[$i]) ) {
            $min = $_[$i-1] if length($min) > length($_[$i-1]);
            $max = $_[$i]   if length($max) < length($_[$i]);
        } else {
            $min = $_[$i]   if length($min) > length($_[$i]);
            $max = $_[$i-1] if length($max) < length($_[$i-1]);
        }
    }

    if ( @_ & 1 ) {
        my $i = $#_;
        if (length($_[$i-1]) <= length($_[$i])) {
            $min = $_[$i-1] if length($min) > length($_[$i-1]);
            $max = $_[$i]   if length($max) < length($_[$i]);
        } else {
            $min = $_[$i]   if length($min) > length($_[$i]);
            $max = $_[$i-1] if length($max) < length($_[$i-1]);
        }
    }

    return ($min, $max);
}

Заметьте, я не писал выше, я просто добавил длину в сравнениях, где до сравнения сравнивалось простое число,К сожалению, я не смог проверить это, потому что я не знаю, как работает AutoLoader, и я продолжал получать:

Use of inherited AUTOLOAD for non-method List::MoreUtils::minmax_stringlength() is deprecated at script.pl line 9.

Так что, если ОП находит, что очень часто использует find max, он может просто использовать свою лицензию и модифицировать MoreUtils, чтобыобеспечьте эту функциональность.

Если кто-то более знающий может проверить, что вышеперечисленное сработает, сделайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...