109 lines
2.3 KiB
Perl
109 lines
2.3 KiB
Perl
#!/usr/bin/env perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
my $usage = "\n\nusage: $0 weldmer\n\n";
|
|
|
|
my $weldmer = $ARGV[0] or die $usage;
|
|
|
|
main: {
|
|
|
|
if (-f $weldmer) {
|
|
open (my $fh, $weldmer) or die $!;
|
|
while (<$fh>) {
|
|
my $weldmer = $_;
|
|
chomp $weldmer;
|
|
&check_weldmer($weldmer);
|
|
}
|
|
close $fh;
|
|
}
|
|
else {
|
|
&check_weldmer($weldmer);
|
|
}
|
|
|
|
exit(0);
|
|
}
|
|
|
|
|
|
####
|
|
sub check_weldmer {
|
|
my ($weldmer) = @_;
|
|
|
|
my $weldmer_len = length($weldmer);
|
|
|
|
my $left_substr = substr($weldmer, 0, int($weldmer_len/2));
|
|
my $right_substr = substr($weldmer, int($weldmer_len/2));
|
|
|
|
# &check_per_id($weldmer);
|
|
&check_per_id($left_substr);
|
|
&check_per_id($right_substr);
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
####
|
|
sub check_per_id {
|
|
my ($weldmer) = @_;
|
|
|
|
my $weldmer_len = length($weldmer);
|
|
|
|
my $half_len = int($weldmer_len/2);
|
|
#print "Half_len of " . length($weldmer_len) . " = $half_len\n";
|
|
|
|
my @chars = split(//, $weldmer);
|
|
|
|
my $max_ratio = 0;
|
|
|
|
my $best_left = "";
|
|
my $best_right = "";
|
|
|
|
for (my $i = 0; $i < $half_len; $i++) {
|
|
|
|
for (my $j = $i + 1; $j <= $half_len; $j++) {
|
|
|
|
my $ref_pos = $i;
|
|
my $other_pos = $j;
|
|
|
|
my $count_same = 0;
|
|
my $count_chars = 0;
|
|
|
|
my $left_sub = "";
|
|
my $right_sub = "";
|
|
|
|
|
|
|
|
while ($other_pos <= $j + $half_len - 1) {
|
|
|
|
$count_chars++;
|
|
if ($chars[$ref_pos] eq $chars[$other_pos]) {
|
|
$count_same++;
|
|
}
|
|
|
|
$left_sub .= $chars[$ref_pos];
|
|
$right_sub .= $chars[$other_pos];
|
|
|
|
$ref_pos++;
|
|
$other_pos++;
|
|
|
|
}
|
|
|
|
my $ratio = $count_same/$count_chars;
|
|
if ($ratio > $max_ratio) {
|
|
$max_ratio = $ratio;
|
|
$best_left = $left_sub;
|
|
$best_right = $right_sub;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
$max_ratio = sprintf("%.3f", $max_ratio);
|
|
print "$weldmer\t$best_left\t$best_right\t$max_ratio\n";
|
|
|
|
return;
|
|
}
|