31
answers
546views


未解决

请教个问题,我用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




    1

    我喜欢这种问题 。哈哈。

    测试测试先。

    Current score: 0
    [Link] | [回复Ta]
    2

    $record =~ /^(LOCUS.ORIGIN\s\n)(.*)\/\/\n/s

    这个是要匹配什么啊?

    Current score: 0
    [Link] | [回复Ta]
    3

    第一个括号里面是匹配gbk文件的所有注释部分,保存在$annotation里,第二个括号里面匹配DNA序列,双斜杠之前的部分,保存在$dna里,可是试了半天只能输出第一个GBK文件!郁闷无比。

    Current score: 0
    [Link] | [回复Ta]
    4

    说白了,其实就是把好多个GBK重新打印一遍,但是已经分别保存在两个变量里了。方便做后续的操作!

    Current score: 0
    [Link] | [回复Ta]
    5

    也可以用$1和$2分别保存,结果,打印了好几遍第一个GBK记录。。。。

    Current score: 0
    [Link] | [回复Ta]
    6

    改为:

    ($annotation, $dna) = ($record =~ /(LOCUS.*ORIGIN)(.*)\/\//s);

    测试通过。

    Current score: 0
    [Link] | [回复Ta]
    7

    @tatianaliu:

    这种情况比较奇怪。从代码看不应该这样子的。
    会不会你的例子文件里都是相同的啊~

    Current score: 0
    [Link] | [回复Ta]
    8

    不是呢。测试文件是三个不同的记录。。。
    刚才试了,应该不是匹配的问题,怀疑是变量声明的问题。。。郁闷。。。

    Current score: 0
    [Link] | [回复Ta]
    9

    噢。你是说后面都为空。
    那是你的匹配有问题了。 只对你的第一个gbk有效。

    呵呵。不要太严格。 改成我上面哪样子的吧。

    Current score: 0
    [Link] | [回复Ta]
    10

    改成($annotation, $dna) = ($record =~ /(LOCUS.*ORIGIN)(.*)\/\//s);了。可是结果还是只有一个文件。。。

    Current score: 0
    [Link] | [回复Ta]
    11

    @tatianaliu:

    那就要把你的3testseq.gb发给我测试测试了。应该是你这个文件的问题。

    Current score: 0
    [Link] | [回复Ta]
    12

    好。。。。可是咋发啊。。。。发到哪里呢。。。。

    Current score: 0
    [Link] | [回复Ta]
    13

    @tatianaliu:

    发到我邮箱了。

    Current score: 0
    [Link] | [回复Ta]
    14

    而且貌似那几个空格应该是匹配注释和DNA序列之间的部分,应该和下一个文件没关系啊。。。

    Current score: 0
    [Link] | [回复Ta]
    15

    发了哦!帮忙看看吧!多谢啦!

    Current score: 0
    [Link] | [回复Ta]
    16

    @tatianaliu:

    有没有把#号改为@号的~~

    Current score: 0
    [Link] | [回复Ta]
    17

    应该没有啊。。。。改了有啥用么?

    Current score: 0
    [Link] | [回复Ta]
    18

    @tatianaliu:

    汗。我是指邮箱哦、

    Current score: 0
    [Link] | [回复Ta]
    19

    汗。。。。没有。。。。

    Current score: 0
    [Link] | [回复Ta]
    20

    又发了。这回改了。。。

    Current score: 0
    [Link] | [回复Ta]
    21

    离开一下哦....等回复。。。。

    Current score: 0
    [Link] | [回复Ta]
    22

    @tatianaliu:

    没事啊。正常输出啊。 三个都输出了。

    只不过你的testseq.gb里最后多了一行。所以多输出了一个空的结果而已。
    把最后一行去掉。

    测试通过。

    Current score: 0
    [Link] | [回复Ta]
    23

    这是什么语言啊?

    Current score: 0
    [Link] | [回复Ta]
    24

    @柳城:
    啊!为什么啊!就是一样的代码么?我死活死活死活出不来!!!天理啊!

    Current score: 0
    [Link] | [回复Ta]
    25

    @柳城:
    你能把你测试用的代码完整的发个给我么?多谢啦!

    Current score: 0
    [Link] | [回复Ta]
    26

    @竹纤维:
    perl啦,喜欢的话推荐你看Beginning Perl for Bioinformatics.

    Current score: 0
    [Link] | [回复Ta]
    27

    @tatianaliu:

    跟你的代码一样的了。

    Current score: 0
    [Link] | [回复Ta]
    28

    我匹配出来结果打印了几遍第一个记录.....晕死了.@柳城:

    Current score: 0
    [Link] | [回复Ta]
    29

    @柳城:
    貌似我的问题在每个记录之间的空行上,手动删除这个空行就匹配正确了,可是,NCBI上下来的数据每个中间就有个空行啊,难道都手工修改?不修改就是输出很多遍第一个记录。

    Current score: 0
    [Link] | [回复Ta]
    30

    @tatianaliu:

    改为:

    ($annotation, $dna) = ($record =~ /(LOCUS.*ORIGIN)(.*)\/\//s);

    我不是说了改为了这个嘛~~ 你的多了个^

    Current score: 0
    [Link] | [回复Ta]
    31

    是哦 !

    Current score: 0
    [Link] | [回复Ta]

Your Answer

You must be logged in to post a comment.

登陆后可评论。