我使用regex逐行读取文件,然后将其拆分为标量变量,如下所示,regex工作得很好。
while (<GTFFILE>) {
if ($_ =~ /(^\d)\s+\w+\s+(\w+)\s+(\d+)\s+(\d+)\s+\.\s+\W\s+\.\s+(\w+\_\w+\s+\"\w+\"\;)/){
my $gene = $1;
my $type = $2;
my $start = $3;
my $end = $4;
my $geneId = $5;试图从regex获取的值生成散列。
$featurestart{$start} = $start;
$featureend{$end} = $end; 我需要找到外显子的长度,使用我从regex生成的散列。这是每行完成的,但我正在接收错误:缺少$ on循环变量。有什么想法吗?
for each ($_) {
$exonlength = ($featureend{$_} - $featurestart{$_});
printf ("Exon lengths: = %1.1f\n", $exonlength);
}在这里,我毫无头绪,我想在$geneId中找到每个单词的出现。HOw,我会去匹配未知的单词,并计数每个未知单词的不同出现情况吗?我猜测某种函数可以聚在一起,也许在散列/数组中,一个单词的重复数在一起,然后以某种方式计算每个集群。
$geneCount{$geneId} = $type;
foreach $geneId {
}
}
}
}GTF文件的每一行为:1未知外显子3204563 3207049。-.gene_id "Xkr4";gene_name "Xkr4";p_id "P15240";transcript_id "NM_001011874.1";tss_id "TSS13146";这是regex正在阅读的内容。外显子在不同的行之间不同,它可以是外显子,或者cds等,每行只有一个外显子,所以计数外显子这个词的出现次数,计算文件上的外显子数。由' exon‘之后的空格分隔的两个数字是坐标,外显子长度是通过从第一个外显子中减去第二个数来计算的。由';‘分隔的短语分组为geneId。对于这些字符串,我希望计算整个文件中本节的出现情况,与外显子类似,这会发生变化,但是不知道字符串可能是什么,所以我们的想法是查找这个变量中发生了多少不同的字符串。
发布于 2014-04-09 12:00:58
好吧,有几个问题。首先,请允许我在任何人提到基因和解析文件时,将我一直渴望创建的到https://metacpan.org/pod/Bio::Perl的强制链接。
当你到达
if ($_ =~ /exon/)$_仍然是整条线。因此,您可以检查当前行中是否包含字符串"exon“。所以我假设你想数数那个字符串的出现情况?遗憾的是,tr///不会为你这么做。相反,它将用自身替换每一个"e“、"x”、"o“或"n”,并计算这种情况发生的频率。所以你数人物,而不是“外显子”。如果您坚持使用这种笨拙的方法来计算s/exon/exon/g而不是tr///,那么就可以了。
编辑:好的,很抱歉我打断了写作。
为您的错误:您试图循环什么?如果你是说
foreach ($_) {那么,这就没有什么意义了,因为$_只是一个元素。外显子的长度是多少?我一点也不知道外显子是什么。但我想你是想用别的方式填充你的哈希。实际上,它们与值具有相同的键,所以从一开始就没有什么意义。
如果您需要帮助,在计数后,您肯定要提供更多的信息,您的输入是什么样子,你想做什么。
在编辑完问题后编辑2:
好吧,如果这是你想要做的,你可以做如下的事情:
my $numberOfExon = 0; # We will increase this whenever we meet an exon.
my @exonLength; # This array will store all the exon lengths
my %geneCount; # This hash will store the counts per geneId
while (<GTFFILE>) {
if ($_ =~ /(^\d)\s+\w+\s+(\w+)\s+(\d+)\s+(\d+)\s+\.\s+\W\s+\.\s+(\w+\_\w+\s+\"\w+\"\;)/){
my $gene = $1;
my $type = $2;
my $start = $3;
my $end = $4;
my $geneId = $5;
if ($_ =~ /exon/){
$numberOfExon++; # just count the lines that have exon in them
my $length = $end - $start; # just calculate the length
push @exonLength, $length; # Do with the length whatever you want
$geneCount{$geneId}++; # Increase the number of times this Id was seen
# If this was the first time, a new field is created
}
}
}
print "Number of Exon: $numberOfExon \n";
print "Count of Ids:\n";
use Data::Dumper;
print Dumper(\%geneCount);这只包括外显子的身份,而不是其他人的身份。如果您想要其他的,只需将geneCount{geneId}++放在第一个} ( If外显子部分)之后。
https://stackoverflow.com/questions/22961594
复制相似问题