my @ans = grep {$_} map { my $func = $_; reduce( sub{ my($first, $second) = @_; return ($first eq $second) && $first; } , map(&$func, @data)); } map { my $ctr = $_; sub { my $str = $_; substr($str, 0, $ctr); } } (1..length($data[0])); print pop(@ans), "\n";