向数组散列中的文件名列表添加前缀

Adding a prefix to a list of file names in a hash of arrays

数组 @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 功能,但它没有用。

因此,迭代每个元素 - 您实际上需要两个循环。一个用于 'top level' - 哈希值。 (这是数组引用)。

然后对于每个数组引用,在应用转换的对象中进行迭代。

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
   }
}

这可以巧妙地完成,方法是根据 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;