我使用正则表达式逐行读取文件,然后将其拆分为标量变量,如下所示,正则表达式正常。
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;
尝试从正则表达式中获取的值生成哈希。
$featurestart{$start} = $start;
$featureend{$end} = $end;
我需要使用正则表达式生成的哈希来查找外显子的长度。这是每行完成的,但我收到错误:在循环变量上缺少$。有什么想法吗?
for each ($_) {
$exonlength = ($featureend{$_} - $featurestart{$_});
printf ("Exon lengths: = %1.1f\n", $exonlength);
}
这里我很无能,我想在$ geneId中找到每个单词的出现次数。我会不会匹配未知单词,计算每个未知单词的不同出现次数?我猜是某种功能集群在一起,也许在哈希/数组中,一个单词的重复在一起然后以某种方式计算每个集群?
$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”; 这就是正则表达式正在阅读的内容。外显子在不同行之间变化,它可以是外显子或cds等,每行只有一个或另一个,所以计算外显子单词的出现次数,计算文件中外显子的数量。在'外显子'之后用空格分隔的两个数字是坐标,外显子长度是通过从第一个数减去第二个数来计算的。由';'分隔的短语被分组为geneId。对于这些我想计算整个文件中这一部分的出现次数,类似于外显子,这会发生变化,但是不知道字符串可能是什么,所以想法是找出这个变量中出现了多少个不同的字符串。
答案 0 :(得分:1)
好的,有几个问题。首先,请允许我将强制性链接放到https://metacpan.org/pod/Bio::Perl,当有人提到基因并解析文件时,我总是痒痒。
当你到达 p>
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);
这只计算外显子的ID,而不是其他的那些。如果您想要其他人,只需将geneCount{geneId}++
放在第一个}
之后(如果是外显部分)。