在数组哈希中为文件名列表添加前缀

时间:2015-03-16 13:11:51

标签: arrays perl hash

数组@lines包含%hash这样的键

HG00117
HG00119
NA20828

等其他许多样本。我刚刚在下面的例子中展示了三个。

use strict;
use warnings;

use Data::Dump;

open (FILE, 'input.txt'); 
chomp (my @lines = (<FILE>)); 
close(FILE);

my %hash;

$hash{$_} = [ glob("$_*.bam") ] for @lines;

dd %hash;

这将打印出我的数组哈希:

(
  "HG00117",
  [
    "HG00117.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
    "HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
    "HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
    "HG00117.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
  ],
  "HG00119",
  [
    "HG00119.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
    "HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
    "HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
    "HG00119.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
  ],
  "NA20828",
  [
    "NA20828.mapped.ILLUMINA.bwa.TSI.exome.20121211.bam_herc2_data.bam",
    "NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20101123.bam_herc2_phase1.bam",
    "NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20130415.bam_herc2_data.bam",
    "NA20828.mapped.illumina.mosaik.TSI.exome.20110411.bam_herc2_phase1.bam",
  ],
)

我想用INPUT=为数组的每个元素添加前缀,所以它们看起来像这样

(
  "HG00117",
  [
    "INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
    "INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
    "INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
    "INPUT=HG00117.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
  ],
  "HG00119",
  [
    "INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
    "INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
    "INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
    "INPUT=HG00119.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
  ],
  "NA20828",
  [
    "INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.exome.20121211.bam_herc2_data.bam",
    "INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20101123.bam_herc2_phase1.bam",
    "INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20130415.bam_herc2_data.bam",
    "INPUT=NA20828.mapped.illumina.mosaik.TSI.exome.20110411.bam_herc2_phase1.bam",
  ],
)

我尝试了正则表达式和grep但似乎没有任何效果。我想我对foreach的范围感到困惑。我也试过rename函数,但它没有用。

2 个答案:

答案 0 :(得分:1)

所以,迭代每个元素 - 你实际上需要两个循环。一个用于'顶级' - 哈希值。 (哪些是数组引用)。

然后使用每个数组引用,在应用转换的那些内迭代。

foreach my $array_ref ( values %hash ) {
   foreach my $oldfilename ( @$array_ref ) {
       $element =~ s/^/INPUT=/;
   }
}

或者你真的想要更改磁盘上的文件名 吗?如果是这样,你可以使用rename(我认为这不是你想要的)

foreach my $array_ref ( values %hash ) {
   foreach my $oldfilename ( @$array_ref ) {
       rename $oldfilename, 'INPUT='.$oldfilename
   }
}

答案 1 :(得分:1)

这可以通过从input.txt的内容构建正则表达式并检查所有*.bam文件来巧妙地完成。

喜欢这个

use strict;
use warnings;

my @patterns = do {
  open my $in_fh, '<', 'input.txt' or die qq{Unable to open "input.txt" for input: $!};
  <$in_fh>;
};
chomp @patterns;
my $re = join '|', map quotemeta, @patterns;

my @files = grep /^(?:$re)/, glob '*.bam';
$_ = "INPUT=$_" for @files;