utterlyconfused has asked for the wisdom of the Perl Monks concerning the following question:

Hi I have the code below working. I now need to set a threshold for how many mis-matches can be tolerated and also set a user-provided limit for how many characters are matched at a time (i.e. matches groups of characters rather than one character at a time).
The two strings are being read in from separate files and compared and a dot printed for each matching group.
. I'm a perl beginner and I've tried combinations of pattern matches but with little success. I would appreciate any help in what to change in the code in order to achieve this/

#!/usr/bin/perl use strict;use warnings; my $i;my $j;my $a; open (FH1,'<', "./CAM3UCA.txt"); open (FH2,'<', "./TCH3A.txt"); my $seq1 = do { local $/; <FH1> }; my $seq2 = do { local $/; <FH2> }; my @s1=split('',$seq1); my @s2=split('',$seq2); my @matrix=(); for($i=0;$i<scalar(@s2);$i++) { for($j=0;$j<scalar(@s1);$j++) { if($s2[$i] eq $s1[$j]) { $matrix[$i][$j]="."; } else { $matrix[$i][$j]=" "; } } } #Printing matrix of dot plot open (FHOUT,">dotplot.txt") or die "cannot open outfile\n"; print FHOUT " "; for($a=0;$a<scalar(@s1);$a++) { print FHOUT "$s1[$a]"; } print FHOUT "\n"; #print FHOUT "\n\n"; for($i=0;$i<scalar(@s2);$i++) { print FHOUT "$s2[$i]"; for($j=0;$j<scalar(@s1);$j++) { print FHOUT "$matrix[$i][$j]"; } print FHOUT "\n"; #print FHOUT "\n\n"; } close FH1; close FH2; close FHOUT;<br>

Replies are listed 'Best First'.
Re: Matrix plot help
by wind (Priest) on Feb 15, 2011 at 21:02 UTC
    This is what I interpret as the intention of your code, after a little cleaning up. Maybe it will help:
    #!/usr/bin/perl use strict; use warnings; my $seq1 = readfile("./CAM3UCA.txt"); my $seq2 = readfile("./TCH3A.txt"); my @s1 = split '', $seq1; my @s2 = split '', $seq2; my @matrix = (); for my $i (0..$#s2) { for my $j (0..$#s1) { $matrix[$i][$j] = $s2[$i] eq $s1[$j] ? '.' : " "; } } # Printing matrix of dot plot my $outfile = 'dotplot.txt'; open my $oh, '>', $outfile or die "Can't open file, $outfile: $!"; print $oh join('', @s1) . "\n"; print $oh join('', @s2) . "\n"; foreach my $row (@matrix) { print $oh join('', @$row) . "\n"; } close $oh; sub readfile { my $file = shift; open my $fh, $file or die "Can't open file, $file: $!"; local $/; <$fh>; }