A somewhat general solution could look like:
use strict;
use warnings;
use Data::Dump::Streamer;
my %replace = (
R => '{A,G}',
S => '{C,G}',
K => '{G,T}',
' ' => '_',
);
my %seqs = (
seq1 => {org => "CAG GTR CAG CTG AAG SAG TCA GG"},
seq2 => {org => "GAK GTG CAG CTT CAG CAG TCR GG"}
);
for my $seqKey (keys %seqs) {
$seqs{$seqKey}{glob} = $seqs{$seqKey}{org};
$seqs{$seqKey}{glob} =~ s/$_/$replace{$_}/g for keys %replace;
push @{$seqs{$seqKey}{expanded}}, map {y/_/ /; $_} glob $seqs{$seq
+Key}{glob};
}
Dump (\%seqs);
Prints:
$RO1 = 'seq1';
make_ro($RO1);
$HASH1 = {
expanded => [
'CAG GTA CAG CTG AAG CAG TCA GG',
'CAG GTA CAG CTG AAG GAG TCA GG',
'CAG GTG CAG CTG AAG CAG TCA GG',
'CAG GTG CAG CTG AAG GAG TCA GG'
],
glob => 'CAG_GT{A,G}_CAG_CTG_AAG_{C,G}AG_TCA_GG',
org => 'CAG GTR CAG CTG AAG SAG TCA GG'
};
$RO2 = 'seq2';
make_ro($RO2);
$HASH2 = {
expanded => [
'GAG GTG CAG CTT CAG CAG TCA GG',
'GAG GTG CAG CTT CAG CAG TCG GG',
'GAT GTG CAG CTT CAG CAG TCA GG',
'GAT GTG CAG CTT CAG CAG TCG GG'
],
glob => 'GA{G,T}_GTG_CAG_CTT_CAG_CAG_TC{A,G}_GG',
org => 'GAK GTG CAG CTT CAG CAG TCR GG'
};
Note that you well need Perl 5.6.0 or later for the glob to work correctly.
Perl is environmentally friendly - it saves trees