首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数组散列中向文件名列表中添加前缀

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

Stack Overflow用户
提问于 2015-03-16 13:11:50
回答 2查看 233关注 0票数 1

数组@lines包含%hash的键,如下所示

代码语言:javascript
复制
HG00117
HG00119
NA20828

其他许多样品也是如此。我刚刚为下面的例子展示了三个例子。

代码语言:javascript
复制
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;

这将打印我的数组散列:

代码语言:javascript
复制
(
  "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=,所以它们如下所示

代码语言:javascript
复制
(
  "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",
  ],
)

我尝试了regex和grep,但是似乎没有什么效果。我想我被foreach的范围搞混了。我也尝试过rename函数,但是它没有工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 13:13:45

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

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

代码语言:javascript
复制
foreach my $array_ref ( values %hash ) {
   foreach my $oldfilename ( @$array_ref ) {
       $element =~ s/^/INPUT=/;
   }
}

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

代码语言:javascript
复制
foreach my $array_ref ( values %hash ) {
   foreach my $oldfilename ( @$array_ref ) {
       rename $oldfilename, 'INPUT='.$oldfilename
   }
}
票数 1
EN

Stack Overflow用户

发布于 2015-03-16 13:36:39

这可以通过从input.txt内容构建正则表达式并对照它检查所有*.bam文件来实现。

像这样

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29077712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档