#!/usr/bin/perl -w use strict; use POSIX qw/ceil/; use Data::Dumper; my %bases = ('a'=>[0,0], 'c'=>[0,1], 'g'=>[1,0], 't'=>[1,1]); my %bvals = ('00'=>'a', '01'=>'c','10'=>'g','11'=>'t'); my $DNA = 'acgtagattaatcgagctagcctgatgcgatcgatcgagagggtctctttattctgatcgatcgcgctagatagcgatcgatcgatcgatacacagttataacagagtcttatatca'; my $DNA_frag1 = 'gatc'; my $DNA_frag2 = 'gcct'; sub DNA_pack { my $instr = shift; my $vt = 0 x ceil(length($instr)/4); my $mo = length($instr) * 2; my @c = split(//,$instr); my $bi = 0; while(my $c = shift(@c)){ my @b = @{$bases{$c}}; vec($vt, $bi, 1) = shift @b; vec($vt, $bi+1, 1) = shift @b; $bi += 2; } return [$mo,$vt]; } sub DNA_unpack { return join('',(map{m/\d\d/?$bvals{$_}:()}split(/(\d\d)/,unpack("b$_[0]->[0]",$_[0]->[1])))); }