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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.