免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2332 | 回复: 8
打印 上一主题 下一主题

<>读取文件时的嵌套问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-07 20:40 |只看该作者 |倒序浏览
需要在读取一个文件的过程中对另外一个文件进行遍历,使用类似如下形式的代码:
while(<FILE1>){
&nbsp;&nbsp;&nbsp;&nbsp;... ...;
&nbsp;&nbsp;&nbsp;&nbsp;while(<FILE2>){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... ...;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;... ...;
}

但是在<FILE2>中只能读取第一行,得知在“<>”嵌套使用过程中会有异常发生,但是如何解决?还请高手指点!

论坛徽章:
0
2 [报告]
发表于 2008-05-07 20:56 |只看该作者
试试用FileHandle模块,然后用它的getline函数,不要用<>操作符

论坛徽章:
0
3 [报告]
发表于 2008-05-07 21:22 |只看该作者
我试了试,好像没出问题啊,要不你贴代码看看?

论坛徽章:
0
4 [报告]
发表于 2008-05-07 21:32 |只看该作者
getline也是调用的<>吧?
我的代码就是上面那样的,只是在内测循环中使用next的时候直接跳出外侧的循环了,使用标签也不管用

论坛徽章:
0
5 [报告]
发表于 2008-05-07 21:48 |只看该作者
我加了个 next 也没有跳出去啊。

btw:你不贴代码,谁也帮不了你。

论坛徽章:
0
6 [报告]
发表于 2008-05-07 22:17 |只看该作者
我的代码:

open IN, "< $infile" or die "$infile: $!";
while (<IN>){
        chomp;
        next if $. == 1;
        my @F = split/\t/;
        my $chro = $F[5];
        my $chrfile = "chr/ref_chr" . $chro . ".fa";
        my $seq = get_seq($chrfile, $ctg);
}
close IN;

sub get_seq{
        my $chrfile = shift;
        my $ctg = shift;
        open CHRO, "< $chrfile" or die "$chrfile: $!";
        my $record = 0;
        my $seq = "";
LOOP:        while (<CHRO>){
                chomp;
                my $line = $_;
                print "$.\n";
                if ($line =~ /^>/){
                        my @F = split/\|/;
                        my $ctg_in = $F[3];
                        $ctg_in =~ s/\..*$//;
                        if ($ctg_in eq $ctg){
                                $record = 1;
                                print "Got $ctg_in\n";
                        }else {
                          next LOOP;
                        }
                }
                if ($record == 1){
                        if ($line =~ /^>/){
                                $record = 0;
                                last LOOP;
                        }
                        $seq .= $line;
                }
        }
        print "$seq\n";
        close CHRO;
        return $seq;
}

论坛徽章:
0
7 [报告]
发表于 2008-05-08 08:19 |只看该作者
是你程序的问题

#!/usr/bin/perl


use strict;
use warnings;

my $infile = 'infile.txt';

open IN, "< $infile"
&nbsp;&nbsp;&nbsp;&nbsp;or die "$infile: $!";

while (<IN>){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chomp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next if $. == 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $chro = (split/\t/)[5];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $chrfile = "chr/ref_chr" . $chro . ".fa";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $ctg = 'test';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $seq = get_seq($chrfile, $ctg);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "$seq\n";
}

sub get_seq{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $chrfile = shift;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $ctg = shift;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $seq;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$chrfile = 'chrfile.txt';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open CHRO, "< $chrfile"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    or die "$chrfile: $!";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (<CHRO>){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chomp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (/^>/){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $ctg_in = (split/\|/)[3];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ctg_in =~ s/\..*$//;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next unless $ctg_in eq $ctg;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$seq = $_;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}               
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $seq;
}



  1. infile.txt
  2. t        h        h        h        h        h        h        h
  3. h        h        h        h        h        h        h        h
  4. h        h        h        h        h        h        h        h
  5. h        h        h        h        h        h        h        h

  6. chrfile.txt
  7. =
  8. =
  9. =
  10. =
  11. >h|test|test|test|test|test|test


  12. >perl -w Perl-1.pl
  13. >h|test|test|test|test|test|test
  14. >h|test|test|test|test|test|test
  15. >h|test|test|test|test|test|test
  16. >Exit code: 0

复制代码

[ 本帖最后由 cobrawgl 于 2008-5-8 10:15 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-05-08 08:22 |只看该作者
你把函数里的 print 都去掉试试

论坛徽章:
0
9 [报告]
发表于 2008-05-08 10:38 |只看该作者
找到问题了,由于我是的inputfile是在windows下生成的,所以我在chomp的时候用了local $/ = '\r';导致在子例程中将文件一次性读入,所以看起来一直只有一行,原来吃过'\n\r'的亏,现在居然又矫枉过正了,真是又上了一课!

非常感谢cobrawgl的耐心帮助,也希望我的教训能给大家些启示,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP