谁能帮我注释一小段perl程序,尤其是if语句判断的是什么啊,while (<IN>) 是自动读一个字符串吗,存在哪里

my %tagId_seq;
my %tagId_count;
my $uniq_tag_num;
my $total_tag_count;
open IN, $seq_file || die $!;
while (<IN>) {
if (/^>(\S+)/) {
my $tagId=$1;
my $count=0;
if (/>\S+\s+(\d+)/) {
$count=$1;
}
my $seq=<IN>; chomp $seq;

my $length=length $seq;
if ($length >=$MIN_LEN && $length <=$MAX_LEN) {
$tagId_seq{$tagId}=$seq;
$tagId_count{$tagId}=$count;
++$uniq_tag_num;
$total_tag_count+=$count;
}
}
}
close IN;

1、open IN, $seq_file || die $!; 这句读文件的,IN是文件句柄的名字,$seq_file指明文件来源, 后面的 || die $!表示 如果前面的open失败 则用 die报告错误,并结束程序, $!在报错的时候内容为实际的出错原因。提示,最好使用3个参数的open函数,比如:
open ( IN, '<', $file_name) or die "Can't open $file_name : $!";
第二个参数 <表示读入, >表示写出, >> 表示追加。
2、while (<IN>) { 这一句, 相当于2句, 首先是 $_ = <IN>;默认读入的内容存在系统默认变量 $_中, 然后while循环 测试 $_的值是否非空,如果读入成功则进入循环;
3、if (/^>(\S+)/) { 这一句用于检查 $_ 的内容和正则表达式 /^>(\S+)/ 是否匹配, ^表示文件头, 用()括起来的内容可以在后面引用匹配的实际的值,如果不需要该值就不需要括号了。比如,文件读入内容为: >nm_415621 rna ; 那么后面紧接着的变量赋值 my $tagId=$1; 结果就是nm_415621 , $1 引用了前面匹配的括号里的内容。
4、原来这样啊,那要是同时读2个变量
(/>(\S)+\s+(\d+)/)
my $tagId=$1;
my $count=$2;
是这样吗?要是没有if,怎么读<IN>里的变量啊,比如my $seq=<IN>; 怎么从 $seq抽取$tagId和$count?
答: 这个不用if来判断是不行的, 因为 $seq=<IN>;理论上是读入文件,但是失败了呢,比如读完了或者文件为空,则 $seq 是没有值的后面也酒不能用了,所以要先确保 $seq 有值,就是要加一句 if ($seq){..} , 还不如 if ($seq=<IN> ){..} 方便;正则匹配的时候也是, 你不知道能不能匹配成功。代码如下:
/>(\S)+\s+(\d+)/;my $tagId=$1;my $count=$2;
有时候对有时候会出错!为什么? 因为可能匹配失败啊,比如这一行内容是 :acgtacgt,肯定没有匹配的内容,my $tagId=$1;my $count=$2;这里的$1和$2是没有值的,所以就会报错了,但是;
if(/>(\S)+\s+(\d+)/){ my $tagId=$1;my $count=$2;} 这个肯定对,成功匹配的时候 $1匹配前面的, $2匹配后面的数字,刚好是想要的内容。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-27
你这应该是读取一个FASTA格式的序列文件,每个序列的名字以“>”开头,下面是序列,但是如果序列是多行的,那么这个程序就有问题了。。。
第2个回答  2011-10-26
整个程序的大致意思是打开$seq_file这个路径的文件,
然后逐行读取while(<IN>)当然是放到$_里面
如果找到满足条件的行,例如
>tagfirst 100
kkkkkkkk
判断读到的行是上面的格式>非空格n个为tag 空格n个 数字n个为个数
读取下一行seq,下一行长度满足要求,以tag为键存储seq和个数。。。。
第3个回答  2011-10-26
--正则
if (/^>(\S+)/) { #如果一行的行首是这种形式:>非空格

if (/>\S+\s+(\d+)/) { # >非空格 123(数字)追问

为什么if (/^>(\S+)/),(\S+)用了括号
if (/>\S+\s+(\d+)/),\S+没用括号,最后(\d+)有括号,有什么区别吗
还有open IN, $seq_file || die $!;
IN只是一个名字吗,还是只要是读文件就要open IN
要是同时读两个文件,IN岂不是就冲突了

追答

--后面 $1 是(...)里的值
要是同时读两个文件:open IN1; open IN2

追问

原来这样啊,那要是同时读2个变量
(/>(\S)+\s+(\d+)/)
my $tagId=$1;
my $count=$2;
是这样吗?要是没有if,怎么读里的变量啊,比如my $seq=; 怎么从 $seq抽取$tagId和$count

谁能帮我注释一小段perl程序,尤其是if语句判断的是什么啊,while...
1、open IN, $seq_file || die $!; 这句读文件的,IN是文件句柄的名字,$seq_file指明文件来源, 后面的 || die $!表示 如果前面的open失败 则用 die报告错误,并结束程序, $!在报错的时候内容为实际的出错原因。提示,最好使用3个参数的open函数,比如:open ( IN, '<', $file_name...

Perl入门教程
一个Perl脚本或程序包含一条或多条语句。这些语句只需直接写在脚本中,而不需要像main()这样的东西作为程序入口。Perl语句以分别结束:print "Hello, world";以星号(#)开始的语句是注释:# This is a comment(这是一条注释)空白字符会被Perl忽略: 1. print 2. "Hello, world" 3. ;……引号里的字符串除外...

perl语言while(<>)是什么意思
open FH,"1.txt";while(<FH>){ print $_;}

我写了一个perl程序,现在我想让程序一直循环,直到我猜出那个数字为止...
LABLE1:while(1){ my $guess = <STDIN>;if($guess > $a){ print "High\\n";next LABLE1;} elsif($guess < $a){ print"Low\\n";next LABLE1;} else { print"Right\\n";last;} } --- C:\\Users\\Hunter\\Documents\\Perl>perl 18.pl 3 2 Low 5 High 3 Right C:\\Users\\Hunter\\D...

能帮我讲讲这个PERL程序么,我想写一个统计ATCG的小程序··这个是跟...
!\/usr\/bin\/perl -wuse strict; #使用 strict 校验语法.my $file=shift; #读取执行程序时的第一个参数作为变量 $file. 这里应该是指文件名.open IN,$file; while(my $line=<IN>){ #打开并读取文件的内容chomp($line); #去掉每一行结尾的换行符.my $t2=$line=~tr\/ATGC\/TACG\/; #...

perl @_ $_ 是什么意思啊
比如 my($para1,$para2...)=@_, 函数调用时填了几个参数,便可以从该数组中取到几个参数。2.$_ 是默认参数的意思,指的是在不指定的情况下,程序处理的上一个变量,比如 open(IN,"<file.txt")while(<IN>){ print $_;} close(IN);这个例子是打开一个文本文件,读取每一行,在没有...

请问下while()里面的<>是什么意思啊
while(<>){ <>是从数组@ARGV中得到的参数 如果@ARGV 是空的 就使用标准输入流 即从command 中 #输入的内容 chomp; #去掉结尾的换行符 unshift @s,$_; # 将读入的内容即$_ 放入数组@s中 } # 会一直循环 直至 手动终止程序 foreach(@s){ print "$_\\n"; #会把数组@s...

请教perl编程问题,只能用perl,其他方法或建议请绕道,O(∩_∩)O谢谢!
my @a=split;#希望你第一列数据里没有空格,有就要另想办法了 A{$a[0]}=$_;用第一列做键 一行做值生成哈希 } while(<B>){ my @b=split;同A if($A{$b[0]}){ #如果名称对应,下面分别输出到AA,BB文件中 print AA $A{$b[0]};print BB $_;} } 思路是这样,希望对你...

python循环语句是什么?
while 判断条件(condition):执行语句(statements)……执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。当判断条件假 false 时,循环结束。Python语言风格简介:Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所...

...Pt30 | perl -e 'while(<>){print if($.==2||$&&&!$s++);$.=0...
AIX什么的我不太懂~不过后面的perl 命令我可以解释下 首先需要知道perl 中 $. 的用法,上次阅读的文件的当前输入行号,可以简单的理解为文件的行号,从1开始。.=0 if(\/^-+$\/); 这里的意思就是如果发现本行是以 - 组成的,那么把当前行号至为0 ,那么下一行就为1;print if($.==2||$&&&...

相似回答