Arrays 向数组哈希中的文件名列表添加前缀

Arrays 向数组哈希中的文件名列表添加前缀,arrays,perl,hash,Arrays,Perl,Hash,数组@lines包含如下%hash的键 HG00117 HG00119 NA20828 ( "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.

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

HG00117
HG00119
NA20828
(
  "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",
  ],
)
其他许多样品也是如此。下面的例子我只展示了三个

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;
我想在数组的每个元素前面加上
INPUT=
,使它们看起来像这样

HG00117
HG00119
NA20828
(
  "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
的范围感到困惑。我还尝试了
重命名
函数,但没有成功。

因此,迭代每个元素-实际上需要两个循环。一个用于“顶层”-散列值。(它们是数组引用)

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

foreach my $array_ref ( values %hash ) {
   foreach my $oldfilename ( @$array_ref ) {
       $element =~ s/^/INPUT=/;
   }
}
或者你真的想更改磁盘上的文件名?如果是这样,你可以使用(我不认为这是你想要的)


这可以通过从
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;
使用严格;
使用警告;
我的@patterns=do{

打开我的$in_fh,'你可以使用
而不是
,因为你不需要操作所需的键。工作得很有魅力!我对不懂这样的东西感到很傻…但我知道作为一个编程新手,我会随着时间和实践而学习!!非常感谢!不..我不需要在磁盘中更改!我需要t输入=在开始时,因为它们是源代码命令的一部分,我需要将
*.bam
文件作为
INPUT=*.bam
等等。好的。然后忽略第二位。您提到的
rename
会以这种方式更改文件名:)哦…我明白了!所以rename实际上会更改磁盘上的文件。是的..th这可能会把我弄得一团糟!谢谢!!!除了重命名之外,你还需要哈希结构吗?我明白了…所以在这里它将适用于%hash之外?我一开始甚至不需要%hash?好的,我已经改变了我的答案,因为我认为“重命名文件”意思是重命名文件!是的,正确。数组
@files
包含所有文件的修改名称,这些文件以
input.txt
中的任何字符串开头,以
.bam
结尾。这就是为什么我问你是否需要哈希,因为简单的文件列表更容易。