ocehb: (Default)
[personal profile] ocehb
задача -- найти начало подмассива в массиве (номер элемента)


sub find ($$) { return scalar split $",(split "@{$_[1]}","@{$_[0]}")[0] }

проверка:

# perl -le '@a = qw|a b c d e f g h i j k|; @b = qw|d e f|;
    sub find ($$) { return scalar split $",(split "@{$_[1]}","@{$_[0]}",2)[0]; }
    print find (\@a,\@b)'
3
#

в случае сложностей поиграть с $".
From: [identity profile] hobohabilis.livejournal.com
Должен признать, что при внешней неказистости функция ваша очень даже ничего себе для нахождения самой первой последовательности элементов массива:

#!/usr/bin/perl
use Benchmark qw(cmpthese);


cmpthese(10, {'find_yours'  => q/find_yours(['a'..'zzzz'], ['cccc'..'eeee'])/,
              'find_mine' => q/find_mine(['a'..'zzzz'], ['cccc'..'eeee'])/});



sub find_yours {scalar split $",(split "@{$_[1]}","@{$_[0]}",2)[0]}


sub find_mine
{
    return unless defined(wantarray);

    my($r2a, $r2b) = @_;

    return if @$r2a < @$r2b;

    my($i, $max, $j, $k, @r) = (-1, @$r2a - @$r2b + 1);

    while (++$i < $max) {

        ($j, $k) = (-1, scalar(@$r2b));

        while ($r2a->[++$j + $i] eq $r2b->[$j] &&
            $r2a->[--$k + $i] eq $r2b->[$k]) {

            next unless $j > $k;

            push @r, $i;    # The match is found.

            $i += $#$r2b;

            last;
        }     
    }

    wantarray ? @r : \@r;
}

Profile

ocehb: (Default)
ocehb

January 2021

S M T W T F S
     12
345 6789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 6th, 2026 03:16 am
Powered by Dreamwidth Studios