use strict; use warnings; my @filenames = @ARGV; my @output; my (@headers_seqs, %head_seqs, %header_pairs, $destination); open(IN1, '<', $filenames[0]) or die "Can't read from multifasta file with alternating lines of headers and sequences $_: $! \n"; open(IN2, '<', $filenames[1]) or die "Can't read from tab-delimited header replacement file $_: $! \n"; while(){ chomp; if ($_=~ m/\>/) #looks for match to the '>' character { my $header = $_; # print $header, "\n"; $header =~ s/\>//; push @headers_seqs, $header; # print "header:", "\t", $header, "\n"; } elsif ($_!~ m/\>/) #looks for match to the '>' character { my $seq = $_; # print "seq:", "\t", $seq, "\n"; push @headers_seqs, $seq; } } print $#headers_seqs, "\n"; %head_seqs = @headers_seqs; ###########################***********************----------------------------------------***********************########################### my @head_orig_new; while(){ chomp; my @line_splits = split('\s+',$_); #print "@line_splits", "\n"; my $orig_header = $line_splits[0]; #print $orig_header, "\n"; my $new_header = $line_splits[1]; #print $new_header, "\n"; push @head_orig_new, $orig_header; push @head_orig_new, $new_header; } #print $#head_orig_new, "\n"; %header_pairs = @head_orig_new; ###########################***********************----------------------------------------***********************########################### foreach(keys %head_seqs) { push @output, '>', $header_pairs{$_}, "\n"; push @output, $head_seqs{$_},"\n"; } ###########################***********************----------------------------------------***********************########################### $destination = $filenames[0].'_headers-replaced.fasta'; open (OUT, '>', $destination) or die "Can't write to file $destination: $!\n"; print OUT @output; close IN1; close IN2; close OUT;