数组@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
函数,但它没有用。
答案 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;