Ok nie ma problemu.
Zacznijmy od poczatku skryptu... prosisz usera o podanie nazw plikow - moim zdaniem (ale to tylko kwestia wyboru) aby user podal nazwy plikow w wierszu polecen:
Kod:
./porownanie.pl plik1 plik2
Wtedy dostep pliku robisz uzywajac zmiennych @ARGV (parametry wywolania programu jak podane w wierszu polecen)
Kod:
open (IN, $ARGV[0]) || die "Nie moge otworzyc pliky $ARGV[0] do odczytu: $!\n";
# analogicznie $ARGV[1] to drugi parametr wywolania
Procedura wczytania ktorej uzywasz jest bardzo powolna i do tego niedokladna, bo wczytujesz z pliku linie i szukasz znakow innych niz /[ACTG]/i i je przeskakujesz. Prosciej wczytac caly plik do tablicy, polaczyc wiersze tej tablicy w jedna linie i usuna w niej znaki ktore tam nie powinny wystepowac. Calosc mozna owinac w procedurke ktora wywolasz raz podajac jako parametr nazwe pliku
Kod:
sub wczytaj_plik {
open (PLIK, $_[0]) || die "Nie moge zaladowac $_[0]: $!\n";
chomp(my @temp = <PLIK>);
close (PLIK);
# laczymy wiersze z pliku w jedna dluga linie
my $dna = join '', @temp;
# wywalamy znaki ktore nie opisuja DNA
$dna =~ s/[^actg]//gi;
# mamy sekwencje DNA do zwrocenia
return $dna;
}
Teraz calosc mozna ladnie uzyc w skrypcie:
Kod:
# wczytujemy sekwencje DNA z pliku
my $dna1 = wczytaj_plik($ARGV[0]);
my $dna2 = wczytaj_plik($ARGV[1]);
to co dostajesz w $dna1 i $dna2 to kompletne ciagi juz odfiltrowane itd...
Dalej sekcja przerabiania ze stringa na macierz - nie ma sensu, bo funkcja compare() robi to sama w sobie na samym poczatku. Tworzenie macierzy (w sumie to hash hashy a nie macierz) $a{t}{t}=... tez nie ma sensu bo funkcja compare() tego nie uzywa... sprawdza za to czy litery na N pozycji w obu ciagach DNA sa identyczne...
Caly program mozna wiec zawrzec w takiej postaci:
Kod:
sub wczytaj_plik {
open (PLIK, $_[0]) || die "Nie moge zaladowac $_[0]: $!\n";
chomp(my @temp = <PLIK>);
close (PLIK);
# laczymy wiersze z pliku w jedna dluga linie
my $dna = join '', @temp;
# wywalamy znaki ktore nie opisuja DNA
$dna =~ s/[^actg]//gi;
# mamy sekwencje DNA do zwrocenia
return $dna;
}
sub compare {
my @a1 = split '', $_[0];
my @a2 = split '', $_[1];
# krotszy string decyduje o porownaniu
my $koniec = $#a1 < $#a2 ? $#a1 : $#a2;
my $wynik = 0;
for (my $l=0; $l<=$koniec; $l++) {
$wynik++ if $a1[$l] eq $a2[$l];
}
# wyliczamy globalne i loklane podobienstwo
my $A = (2 * $wynik) / ($#a1 + $#a2 + 2);
my $B = $wynik / ($koniec+1);
print "Podobne = $wynik, A = $A, B = $B\n";
}
#
# GLOWNA CZESC PROGRAMU
# wywolanie: porownaj.pl plikdna1 plikdna2
#
# wersja czytelna
my $dna1 = wczytaj_plik($ARGV[0]);
my $dna2 = wczytaj_plik($ARGV[1]);
compare ($dna1, $dna2);
# wersja skrocona ktora robi dokladnie to samo... ale jest mniej czytelna
#compare(wczytaj_plik($ARGV[0]), wczytaj_plik($ARGV[1]));