LINUX.ORG.RU

Функциональный стиль в perl

 , ,


0

1

Господа перловоды, кто пишет на перле в функциональном стиле? Насколько это вообще оправдано по производительности? Как можно помержить два хеша используя функциональщину? Не проклянут ли меня люди, которые потом будут править скрипты?

★

Насколько это вообще оправдано по производительности?

Функции жрут ~ 500кб. Производительный код на Pure Perl обычно не пишут. Так что, если задача != performance-specific, то пиши и не бойся. Вот взять тот же Mojo, выдает 500 rp/s в 21 веке и ничего, народ хавает.

Не проклянут ли меня люди, которые потом будут править скрипты?

Проклянут. Когда будут ловить утечки из-за пропущенного undef $cb будут проклинать с утроенной силой.

gh0stwizard ★★★★★
()
Ответ на: комментарий от anonymous

и где там функциональщина?

# This does a straight merge of hashes, delegating the merge-specific
# work to 'merge'

sub _merge_hashes {
    my $self = &_get_obj;    # '&' + no args modifies current @_

    my ( $left, $right ) = ( shift, shift );
    if ( ref $left ne 'HASH' || ref $right ne 'HASH' ) {
        carp 'Arguments for _merge_hashes must be hash references';
        return;
    }

    my %newhash;
    foreach my $leftkey ( keys %$left ) {
        if ( exists $right->{$leftkey} ) {
            $newhash{$leftkey} = $self->merge( $left->{$leftkey}, $right->{$leftkey} );
        }
        else {
            $newhash{$leftkey} = $self->{clone} ? $self->_my_clone( $left->{$leftkey} ) : $left->{$leftkey};
        }
    }

    foreach my $rightkey ( keys %$right ) {
        if ( !exists $left->{$rightkey} ) {
            $newhash{$rightkey} = $self->{clone} ? $self->_my_clone( $right->{$rightkey} ) : $right->{$rightkey};
        }
    }

    return \%newhash;
}

by_zero ★
() автор топика

Я пишу, всё отлично, производительность алгоритмами в основном обуславливается, от функциональщины небольшой оверхед.

Как можно помержить два хеша используя функциональщину?

Как ты это вообще себе представляешь? Нужна просто рекурсивная функция, например:

sub hash_merge {
    map {ref $_ eq 'HASH' or return warn "This is not hashref!"} @_;
    my ($h1, $h2)=@_;
    local %_=%{$h1};
    @_{keys %$h2}=values %$h2;

    while (my ($k, $v)=each %$h1) {
        if (ref $v eq 'HASH') {
            $_{$k}=&hash_merge($v, $h2->{$k}) if exists $h2->{$k};
        }
    }
    return \%_;
}

Не проклянут ли меня люди, которые потом будут править скрипты?

Ну тут два варианта, либо писать лапшу с if-else на десятки строк, либо так

disarmer ★★★
()

По заголовку вспомнился вот этот пост. http://eax.me/perl-fp/

Может полезно будет. Сам по сабжу ничего сказать не могу.

zinfandel ★★
()

Не проклянут ли меня люди, которые потом будут править скрипты?

Думаю, что да

int13h ★★★★★
()

кто пишет на перле в функциональном стиле?

Только в функциональном наверное никто. Всякое встречается в коде.

Насколько это вообще оправдано по производительности?

оверхед не настолько большой чтоб был заметен на глаз, наверное :)

Как можно помержить два хеша используя функциональщину?

что может быть проще %hash3 = (%hash1, %hash2), а затем удалить %hash3 если не нужно?

Не проклянут ли меня люди, которые потом будут править скрипты?

если будешь усложнять то, что можно сделать проще, только если на это нет веских причин - будут. И, имхо, будут правы.

Deleted
()
Ответ на: комментарий от by_zero

obl:

sub merge_hashes { mergeHashes::merge_hashes(@_)  } 
Просто зачем воротить? Можешь представить, что это тип state монадка.

anonymous
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.