簡體   English   中英

Perl:對散列進行排序以匹配切割現場陣列的順序

[英]Perl: Sort hash to match order of array of cutsites

你好,我在以下代碼上遇到麻煩,在與程序相同的文件夾中名為data的文件夾中有一個fasta文件(文本)。

這個文件就是這樣

gi | 199581428 | gb | EU710615.1 | 柱狀黃桿菌FclIS(fclIS)基因,全cds ATGGTAGAAACTCAATTTAAAAATACGGATATCGGGTTGATTCCTGAGGATTGGGAAGTGAAACAATTAG GAGAAGTTATAACATTAATTAATGGTCGAGCATATTCTCAGAATGAATTATTATTTAATGGAAAATACAG GGTTTTGAGAGTTGGAAATTTCTTTTCAAGTGACAAATGGTATTGGAGTAATTTAGAATTAGCAAGTAAA TTCTATGTAAATAAAGGGGATTTAATGTATGCTTGGTCTGCATCCTTTGGTCCAAAATTTTGGAAAAACG AAAAGACAATTTACCATTATCATATTTGGAAAATCGAATTATCTGAATATTTAGATAAGTTTTATCTTTT TTATGTACTTGAAAAGGATAAAGAGAATATTTTAAATCAATCACAAGGTGGAACAATGTTTCATATAACT AAGGAATCAATGGAAAAAAGAAAAATTCCAATTCCTTCTTTAAAAGAACAACAAGCCATCGCCGAAGTAT TATCTGATACCGATGCTTGGATAGAAAGCCTTGAAAAACTTATTACTAAAAAACGCTTGGTAAAACAAGG AGCAATGCAACAACTTTTAACACCCAAAGAGGATTGGGAGGTAAAGAAGTTGGGAGAAATAGCTGAAGTT AGAGATGGTACTCACCAAACTCCAACTTACGTAGAAAGTGGAATACCATTTTATAGTGTAGAAAGTGTCA CTAAAAACGATTTCAAGAATACAAAATACATTTCAGAACAAGAACATAAAATTCTTACAAAGTCCTTTAG AATTGAAAAAGGCGATATATTAATGACACGAATTGGGTCAATTGGAGATTGTAAATTAATTGATTGGGAT GTCAATGCAAGTTTTTATGTAAGCTTAGCATTATTAAAAGTAAAACCCATATTTTCAGCTAATTATTTAT GTCACTATTCAAAAACAGA AAATTTCAAAAAAGAGATAGATATAAATTCATTACAATCTGCAATTCCTAA AAAAATAAATCTAGGTCCTATTTCTAACGTAAAAATAGAATTGACGTCACTTGATGAACAACAACGTATC GCAACCATTCTGTCCGATATGGATGCCGAAATAGAACATTTAGAAAAGAAAACACAACCAGCCAAGCAACCATCACTCTCCATCGTCACG

我在用戶STDIN為“ AluI”時無法對輸出進行排序,我想對哈希進行排序,以便通過將輸出中的'/'站點從最早到最新進行排序來對輸出的哈希進行排序。

my $DIRNAME = 'data';
my %RE =( 'AatII' => 'GACGTC 5', 'AccI' => 'GTMKAC 2', 'AclI' => 'AACGTT 2', 'AcyI' => 'GRCGYC      2', 'AflII' => 'CTTAAG 1', 'AflIII' => 'ACRYGT 1', 'AgeI' => 'ACCGGT 1', 'AhaIII' => 'TTTAAA 3',    'AhdI' => 'GACNNNNNGTC 6', 'AluI' => 'AGCT 2', );
my $input='';
my @enz = keys %RE;

opendir(my $dh, $DIRNAME) || die 'Error opening directory: ' . $DIRNAME;
  # Get the list of files
  my @filenames = readdir($dh);
  my $file_count = @filenames;
  # Filter out files without .fa extension
  @filenames = grep { /\.fa$/ } @filenames;
  # Sort the filenames
  @filenames = sort @filenames;

  foreach my $filename (@filenames) {
my $fh;
my $path = sprintf('%s/%s', $DIRNAME, $filename);
if (!open($fh, $path)) {print 'Failed to open %s; skipping', $path;
  next;
}

my $header = <$fh>;
chomp $header;

if ($header =~ />gi\|(\d+)\|gb\|(\w+)\.(\d+)\|(.+)$/) {
  print '*' x 80;
  print "\n";
  print "filename: $filename";
  print "\n";
  print "gi number: $1";
  print "\n";
  print "accession number: $2";
  print "\n";
  print "version: $3";
  print "\n";
  print "description: $4";
  print "\n";
  while ($input ne 'quit') {
print "RE:";
$input = <STDIN>;
chomp $input;
foreach (@enz) {
    if ($input =~ /$_/) {
        #print "$_\n";
        my $val = $RE{$_};
        my $real = substr($val, 0, -2);
        my $cut = chop $val;
        my $length = length ($real);
        my %ha;
        my @fragaft = ();
        my @fragbef = ();
        my @endar = ();

        while (my @line = <$fh>) {
            my $join = join "", @line;
            foreach ($join) {
                while ($_ =~ /($real)/g) {
                    my $length = length($&);
                    #print "$length\n";
                    my $pos = length($`);
                    #print "$pos\n";
                    my $end = $pos + $length;
                    push @endar, $end;
                    my $endlen = $end - ($length-$cut);
                    #print "$endlen\n";

                    #print "$join\n";
                    my @fragbef = substr ($join, 0, $endlen);
                    my @fragaft = substr ($join, $endlen);

                    @ha{@fragbef} = @fragaft;


                }
                print "\n\n\t\t\tCUT POSITIONS: $_\n" foreach @endar;
                foreach(keys %ha) { print "\n$_ / $ha{$_}\n"; }
            }
        } 

    }


    }
}
}
}

輸出在此處給出: http : //i.stack.imgur.com/17LLb.jpg (我沒有足夠的聲譽在此處發布此圖片)在這種情況下,我希望ASDASDA / ASDASDSD的順序與“ CUTSITE”位於頂部,甚至更好。 要這樣顯示:Cutsite:1 => A / AAAA Cutsite:3 => AAA / AAAA Cutsite:7 => AAAAAA / A,但帶有換行符。

任何幫助,將不勝感激。

您是否正在尋找foreach ( sort keys %ha ) { – tjd

是這樣-Khuram Bhatti

不僅是這樣 ,還可以完全滿足您的要求

我希望ASDASDA / ASDASDSD的訂單與頂部的“ CUTSITE”的訂單相匹配...


現在為

甚至更好。 要這樣顯示:Cutsite:1 => A / AAAA Cutsite:3 => AAA / AAAA Cutsite:7 => AAAAAA / A,但帶有換行符。

更改

                    my @fragbef = substr ($join, 0, $endlen);
                    my @fragaft = substr ($join, $endlen);

                    push @fragbef, substr($join, 0, $endlen);
                    push @fragaft, substr($join, $endlen);

                print "\n\n\t\t\tCUT POSITIONS: $_\n" foreach @endar;
                foreach(keys %ha) { print "\n$_ / $ha{$_}\n"; }

                for (0..$#endar)
                { print "Cutsite: $endar[$_] =>\n$fragbef[$_]/$fragaft[$_]\n" }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM