поиск подсписка в списке
Jul. 11th, 2008 10:47 amзадача -- найти начало подмассива в массиве (номер элемента)
проверка:
в случае сложностей поиграть с
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
#
в случае сложностей поиграть с
$".
При внешней неказистости...
Date: 2008-08-05 01:37 am (UTC)#!/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; }