use Benchmark; @files = qw(model4run1 model2run1 model4run2 model1run1 model); sub bobn { my @files = @_; my $posn = -1; my $same = 1; while(defined $same and $posn <= length $files[0]){ my $chr = substr($files[0], ++$posn, 1); for my $name (@files) { undef $same and last if(substr($name, $posn, 1) ne $chr or length $name < $posn); } } return substr($files[0], 0, $posn); } sub Albannach { my @files = @_; my $posn = -1; my $same = 1; while(defined $same){ die if $posn > length $files[0]; my $chr = substr($files[0], ++$posn, 1); for my $name (1..$#files) { undef $same and last if(substr($files[$name], $posn, 1) ne $chr or length $files[$name] < $posn); } } return substr($files[0], 0, $posn); } sub Jenda { my @files = @_; my $first = shift(@files); my $combined = $first; foreach (@files) { $combined &= $_; } $combined ^= $first; $combined =~ s/[^\x00].*//; return substr($first, 0, length($combined)); } sub tye { my @files = @_; my $model= pop @files; my $len= length($model); for my $item ( @files ) { my $dif= $model ^ substr($item,0,$len); $len= length( ( $dif =~ /^(\0+)/ )[0] ); substr( $model, $len )= ""; } return $model; } sub artist { my @files = @_; my @array = split //,shift @files; my @prefix; foreach (@files) { @prefix = (); while ($c = shift @array) { next unless /^$c/; s/^$c//; push @prefix,$c; } @array = @prefix; } return (join ""=>@prefix); } sub yosefm { my @files = @_; PREF: for my $i (0..length($files[0])-1) { my $substr = substr($files[0], 0, $i+1); (/^$substr/ or return substr($files[0], 0, $i)) for (@files[1..$#files]); } } sub tilly { my @files = @_; my $sep = chr(033); my $str = join $sep, @files; if ($str =~ /^([^$sep]*)[^$sep]*($sep\1[^$sep]*)*\z/s) { return $1; } else { die "Pattern unexpectedly failed to match?"; } } sub insert { my $trie=shift; my $str=shift; $trie=$trie->{$_}||={} foreach (split //,$str); } sub common { my $trie=shift; my $common=""; while (1==scalar keys %$trie) { my $char=(keys %$trie)[0]; $common.=$char; $trie=$trie->{$char}; } $common; } sub demerphq { my @files = @_; my %trie; insert(\%trie,$_) foreach @files; return common(\%trie); } print "bobn: " . bobn(@files) . "\n"; print "Albannach: " . Albannach(@files) . "\n"; print "Jenda: " . Jenda(@files) . "\n"; print "tye: " . tye(@files) . "\n"; print "artist: " . artist(@files) . "\n"; print "yosefm: " . yosefm(@files) . "\n"; print "tilly: " . tilly(@files) . "\n"; print "demerphq: " . demerphq(@files) . "\n"; timethese 100000, { bobn => sub {bobn(@files)}, Albannach => sub {Albannach(@files)}, Jenda => sub {Jenda(@files)}, tye => sub {tye(@files)}, artist => sub {artist(@files)}, yosefm => sub {yosefm(@files)}, tilly => sub {tilly(@files)}, demerphq => sub {demerphq(@files)}, }