请教个问题,我用perl匹配gbk文件,文件是多个gbk文件的集合,首先想吧annonation和dna分别匹配上,并且输出,更改了$/的值为每个GBK记录结尾的//,所以,一个record就是一个GBK文件,可是匹配完了发现,只能匹配上第一个记录,后面的都为空,实在搞不清怎么回事!源代码如下,求助!!!
my $filename = '3testseq.gb';
unless (open(GBFILE, $filename)) {
print "Cannot open GenBank file $filename\n";
exit;
}
Set input separator to "//\n" and read in a record to a scalar
local $/ = "//\n";
while($record=<GBFILE> ){
Now separate the annotation from the sequence data
($annotation, $dna) = ($record =~ /^(LOCUS.*ORIGIN\s\n)(.*)\/\/\n/s);
Print the two pieces, which should give us the same as the
original GenBank file, minus the // at the end
print RESULT "$record\n"; #打印record没问题,能匹配上每个文件
print RESULT "$annotation, $dna\/\/\n\n";
}#while
有点相关的问题
- 使用perl批量处理文件? (1.000)
- 如何利用用perl编程取得100000个不相同的随机数? (1.000)
- 请问,这应怎么办?thank u in advance. (1.000)
- 求助:如何将gff格式序列的部分注释信息加到相应的fasta格式序列中。 (1.000)
- 求助:flag variables 怎么用? (1.000)
- 关于fasta文件的合并 (1.000)
- 如何从一个DNA序列中提取特定的序列? (1.000)
- 如何利用perl和blast从多个序列中寻找到一条大概21至24bp左右的公共序列? (1.000)
- perl画图程序求解释 (1.000)
- 求助:如何从众多数据中提取数据的坐标信息 (1.000)
- 有关perl中的split函数的问题 (RANDOM - 1.000)
我喜欢这种问题 。哈哈。
测试测试先。
362●
$record =~ /^(LOCUS.ORIGIN\s\n)(.*)\/\/\n/s
这个是要匹配什么啊?
362●
第一个括号里面是匹配gbk文件的所有注释部分,保存在$annotation里,第二个括号里面匹配DNA序列,双斜杠之前的部分,保存在$dna里,可是试了半天只能输出第一个GBK文件!郁闷无比。
29●
说白了,其实就是把好多个GBK重新打印一遍,但是已经分别保存在两个变量里了。方便做后续的操作!
29●
也可以用$1和$2分别保存,结果,打印了好几遍第一个GBK记录。。。。
29●
改为:
($annotation, $dna) = ($record =~ /(LOCUS.*ORIGIN)(.*)\/\//s);测试通过。
362●
@tatianaliu:
这种情况比较奇怪。从代码看不应该这样子的。
会不会你的例子文件里都是相同的啊~
362●
不是呢。测试文件是三个不同的记录。。。
刚才试了,应该不是匹配的问题,怀疑是变量声明的问题。。。郁闷。。。
29●
噢。你是说后面都为空。
那是你的匹配有问题了。 只对你的第一个gbk有效。
呵呵。不要太严格。 改成我上面哪样子的吧。
362●
改成($annotation, $dna) = ($record =~ /(LOCUS.*ORIGIN)(.*)\/\//s);了。可是结果还是只有一个文件。。。
29●
@tatianaliu:
那就要把你的3testseq.gb发给我测试测试了。应该是你这个文件的问题。
362●
好。。。。可是咋发啊。。。。发到哪里呢。。。。
29●
@tatianaliu:
发到我邮箱了。
362●
而且貌似那几个空格应该是匹配注释和DNA序列之间的部分,应该和下一个文件没关系啊。。。
29●
发了哦!帮忙看看吧!多谢啦!
29●
@tatianaliu:
有没有把#号改为@号的~~
362●
应该没有啊。。。。改了有啥用么?
29●
@tatianaliu:
汗。我是指邮箱哦、
362●
汗。。。。没有。。。。
29●
又发了。这回改了。。。
29●
离开一下哦....等回复。。。。
29●
@tatianaliu:
没事啊。正常输出啊。 三个都输出了。
只不过你的testseq.gb里最后多了一行。所以多输出了一个空的结果而已。
把最后一行去掉。
测试通过。
362●
这是什么语言啊?
8●
@柳城:
啊!为什么啊!就是一样的代码么?我死活死活死活出不来!!!天理啊!
29●
@柳城:
你能把你测试用的代码完整的发个给我么?多谢啦!
29●
@竹纤维:
perl啦,喜欢的话推荐你看Beginning Perl for Bioinformatics.
29●
@tatianaliu:
跟你的代码一样的了。
1●
我匹配出来结果打印了几遍第一个记录.....晕死了.@柳城:
29●
@柳城:
貌似我的问题在每个记录之间的空行上,手动删除这个空行就匹配正确了,可是,NCBI上下来的数据每个中间就有个空行啊,难道都手工修改?不修改就是输出很多遍第一个记录。
29●
@tatianaliu:
改为:
($annotation, $dna) = ($record =~ /(LOCUS.*ORIGIN)(.*)\/\//s);
我不是说了改为了这个嘛~~ 你的多了个^
362●
是哦 !
29●