在perl中调用哈希中的键

时间:2015-10-10 01:18:29

标签: perl hash bioinformatics

这是此网站上my very first question的扩展名。

现在我有以下代码:

conda install netCDF4

我在最后根据Unix命令的要求成功地将正向和反向fastq文件配对。现在,我一直坚持如何相互调用对的各个组件。

我已经考虑通过输入密钥作为用户输入来访问哈希,但是这些数字是在脚本中随机生成的,我不想在运行之前强制用户输入这些值Unix脚本。

另外,我检查过的所有示例都已经在哈希中提供了固定数量的密钥。根据用户想要合并的文件数量,散列中的密钥数量也会有所不同。

我知道我想创建一个循环,以便命令可以多次运行;程序FLASH一次只能接受一个正向和反向fastq文件。因此,必须循环正向和反向fastq读取,以便处理每个读取。

如何在将它们组合成一个哈希后,取出我想要使用的特定文件?

1 个答案:

答案 0 :(得分:1)

我对你所需要的最好的猜测是将给定目录中的所有.fastq文件配对,并为每对调用flash实用程序

您自己的代码存在许多问题,并且您似乎在%pairs哈希中保留了您需要的更多信息(我认为您需要的只是文件名,样本ID和格式)所以我写了这个

我还使用了一个简单的glob代替opendirreaddirclosedir这似乎是一个更好的选择

我已经尽可能地测试了它,看起来很好

#!/usr/bin/perl
use strict;
use warnings;

use File::Basename qw/ basename /;

my $flash = '/usr/local/flash/flash';

print "Please provide the directory containing\n";
print "the fastq files from your Illumina MiSeq run: ";
my $fastq_file_dir = <STDIN>;
chomp $fastq_file_dir;

print "Please provide the minimum overlap between the two reads in bp: ";
my $min_overlap = <STDIN>;
chomp $min_overlap;

print "Please provide the maximum overlap between the two reads in bp: ";
my $max_overlap = <STDIN>;
chomp $max_overlap;

print "Now provide the output directory for your merged fastq reads: ";
my $out_dir = <STDIN>;
chomp $out_dir;

my @files = glob "$fastq_file_dir/*.fastq";

my %pairs;

for my $fastq_file ( @files ) {

    my $file = basename $fastq_file;
    my ($sample_id, $format) = (split /_/, $file)[0,3];

    $pairs{ $sample_id }{ $format } = $file;
}

printf "Processing %d pairs of FASTQ files\n\n", scalar keys %pairs;
chdir $fastq_file_dir;

for my $sample ( sort keys %pairs ) {

    my $pair = $pairs{$sample};
    my ($forward, $reverse) = @{$pair}{qw/ R1 R2 /};

    print "Forward: $forward\n";
    print "Reverse: $reverse\n";
    print "\n";

    my $cmd = qq{$flash $forward $reverse -m $min_overlap -M $max_overlap -d $out_dir};
    system $cmd;
}