【发布时间】:2012-06-22 19:00:47
【问题描述】:
我是 Perl 以及一般编程的绝对新手(不到一个月的经验)。
如果我要解决更大的问题,我会遇到一个需要解决的问题。
基本上,我有 2 个如下所示的数组:
@array1 = ('NM_1234' , '1452' , 'NM_345' , '5008' , 'NR_6145' , '256');
@array2 = ('NM_5673' , '2' , 'NM_345' , '5' , 'NR_6145' , '10');
@array1 包含 id 编号,后跟长度。 id号是核苷酸序列,length是序列的长度。
@array2 包含 id 编号,后跟 G-Quadruplex 结构的数量,因此某些序列仅包含 2 个此类结构,而其他序列包含 10 个或更多。
基本问题是,我需要在@array1(例如5008、256)中为每个匹配的id 号添加“长度数字”。
所以例如 NM_345 在两个数组中都匹配,我需要在其中添加 5008,这样最终的结果就会变成像 NM_345,5, 5008.
与 NR_6145 和其他类似匹配(@array2 中有超过 20,000 个 id 号码)
到目前为止,我已经能够编写可以在两个数组中搜索相同 ID 号的代码。这是代码:
#Enter file name
print "Enter file name: ";
$in =<>;
chomp $in;
open(FASTA,"$in") or die;
@data = <FASTA>; #Read in data
$data = join ('',@data); #Convert to string
@data2 = split('\n',$data); #Explode along newlines
#Enter 2nd file name
print "\n\nEnter 2nd file name: ";
$in2=<>;
chomp $in2;
open(FASTA,"$in2") or die;
@entry =<FASTA>; #Read in data
$entry = join('',@entry); #Convert to string
@entry2 = split('\n',$entry); #Explode along newlines
my %seen;
for $item (@data2) {
if($item =~ /([0-9]+)/){
push @{$seen{$key}}, $item;#WHAT IS THIS DOING? HOW?
}
}
for my $item (@entry2) {
if ($item =~ /([0-9]+)/){
if (exists $seen{$key}) {
print $item,"\n";
};
}
}
exit;
我从这里的解决方案中派生了从 2 个数组中找到相同元素的代码,因此完全归功于 Chas.Owens:https://stackoverflow.com/a/1064929/1468737。 当然,我还不太了解这部分:
push @{$seen{$key}}, $item;#WHAT IS THIS DOING? HOW?
它似乎是一个散列值或什么的数组?
那么,现在如何将@array1 中的长度元素添加到@array2 中?我需要使用我认为的拼接命令,但是如何?
我想要的输出应该是这样的:
NM_345,5,5008 <br>
NM_6145,10,256<br>
etc
我还需要将此输出保存到一个文件中,然后分析该文件以查看长度和 G-四链体数之间是否存在任何相关性。
任何帮助或意见将不胜感激。
感谢您花时间解决我的问题!
编辑:此编辑是为了显示数据文件的外观。它们基本上是我编写的其他程序的 putput 文件。
我的第一个文件名为 Transcriptlength.fa,其中有超过 40,000 个 ID 号进入 @array1,如下所示:
NR_037701
3353
NM_198399
2414
NR_026816
601
NR_027917
658
NR_002777
1278
我的第二个文件,名为 Quadcount.AllGtranscripts.fa,有超过 20,000 个 ID 号码进入 @array2,如下所示:
NM_000014
1
NM_000016
3
NM_000017
19
NM_000018
2
NM_000019
3
NM_000020
30
NM_000021
1
NM_000022
2
NM_000023
5
NM_000024
1
NM_000025
15
NM_000029
5
【问题讨论】:
-
每个文件中数据的格式是什么?
-
有什么理由不能将这些数组声明为哈希?这将使我输入的解决方案更容易。
-
我想第一个数组不能轻易转换为哈希。至少我在构建我的解决方案时完全假设:可以为每个序列存储多个长度。 )
-
无论如何,你想要像
my %data; $data{ 'a_sequence' } = ( $count, $length );这样的东西,它将一个数组引用分配给一个哈希键。阅读perldoc perreftut -
($count, $length)不是参考,它是一个列表。应该改用[$count, $length]。
标签: arrays perl bioinformatics