数组@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",
],
)我尝试了regex和grep,但是似乎没有什么效果。我想我被foreach的范围搞混了。我也尝试过rename函数,但是它没有工作。
发布于 2015-03-16 13:13:45
所以,迭代每个元素-你实际上需要两个循环。一个用于“顶级”--哈希值。(它们是数组引用)。
然后,对每个数组引用,在应用转换的数组中迭代。
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
}
}发布于 2015-03-16 13:36:39
这可以通过从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;https://stackoverflow.com/questions/29077712
复制相似问题