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
结尾。这就是为什么我问你是否需要哈希,因为简单的文件列表更容易。