I really liked the one-liner, just that it doesn't work - it fails for 000 720
Here's what I came up with. Is doesn't look that efficient, but it has the advantage of using no regexen for the actual comparison (only for split).
#!/usr/bin/perl -wl
use strict;
use warnings;
sub Prefix {
{
my $e = scalar(@_);
return '' if ($e == 0);
return $_[0] if ($e == 1);
}
my $minlen;
my @d = map {
my @split = split(//, $_);
my $l = scalar(@split);
if (defined($minlen)) {
$minlen = $l if ($l < $minlen);
} else {
$minlen = $l;
}
\@split;
} @_;
my $p = '';
my $i = 0;
while($i < $minlen) {
my $c = $d[0]->[$i];
return $p unless ($c);
for (my $j = 1; $j <= $#d; $j++) {
return $p unless ($c eq $d[$j]->[$i]);
}
$p .= $c;
$i++;
}
$p
}
while (<DATA>) {
print "$_=> ", Prefix(split ' ',$_);
}
__DATA__
model4run1 model2run1 model4run2 model1run1
model4run1 model2run1 model4run2 abbot
model4run1 model2run1 abbot model1run1
model4run1 model2run1 model4run2 monk
model4run1 model2run1 monk model1run1
testing terse testing time
monk model4run1 model2run1 model1run1
000 720
a
aa
abc
a aa
a aa aaa
ab ba bb