谁能帮我注释一小段perl程序,尤其是if语句判断的是啥啊,while (<IN>) 是自动读一个字符串吗,存在哪里
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁能帮我注释一小段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;
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匹配后面的数字,刚好是想要的内容。 参考技术A 你这应该是读取一个FASTA格式的序列文件,每个序列的名字以“>”开头,下面是序列,但是如果序列是多行的,那么这个程序就有问题了。。。 参考技术B 整个程序的大致意思是打开$seq_file这个路径的文件,
然后逐行读取while(<IN>)当然是放到$_里面
如果找到满足条件的行,例如
>tagfirst 100
kkkkkkkk
判断读到的行是上面的格式>非空格n个为tag 空格n个 数字n个为个数
读取下一行seq,下一行长度满足要求,以tag为键存储seq和个数。。。。 参考技术C --正则
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
谁能帮我把这个程序改为verilog语言必有重谢
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity epm240 is
port(clk :in std_logic; --系统时钟
oe :out std_logic; --TLC5510的输出使能/OE
clk1:out std_logic; --TLC5510的转换时钟
din:in std_logic_vector(7 downto 0); --来自TLC5510的采样数据
dout:out std_logic_vector(7 downto 0);
KEY:in std_logic;
clkout:out std_logic);--FPGA数据输出
end epm240;
architecture behav of epm240 is
signal q:std_logic; --全局变量
begin
led:block
SIGNAL KIN,CLKTMP,T:STD_LOGIC:='1';
begin
process(clk)
VARIABLE m:std_logic_vector(26 downto 0);
begin
if clk'event and clk='1' then
m:=m+1;
end if;
IF T='1' THEN
clkout<=m(26);
--clkout1<=m(24);
ELSE
clkout<=m(24);
--clkout1<=m(26);
END IF;
CLKTMP<=M(19);
end process;
KEYBOARD_DIFF : block
signal D0,D1 : STD_LOGIC:='1';
begin
process (CLKTMP)
begin
if CLKTMP'event and CLKTMP='1' then --CLK rising
D1<=D0; D0<=not KEY; --delay
end if;
end process;
KIN <= D0 and not D1; --differential
end block KEYBOARD_DIFF;
process(KIN)
begin
if KIN'event and KIN='0' then
T<=NOT T;
end if;
end process;
end block led;
process(clk) --此进程中,把CLK 进行4分频,得到TLC5510的转换时钟
begin
if clk'event and clk='1' then
q<=not q;
end if;
clk1<=q; --对系统CLK进行4分频
end process;
oe<='0';
dout<=din; --采样数据输出
end behav;
reg [26:0] m;
always @(posedge clk) m<=m+27\'b1;
assign clkout = T ? m[26] : m[24];
// assign clkout1 = T ? m[24] : m[26];
assign clktmp = m[19];
reg D0, D1;
always @(posedge CLKTMP) begin
D1 <= D0;
D0 <= ~KEY;
end
assign kin = D0 &~ D1;
reg T, q;
always @(negedge kin) T <= ~T;
always @(posedge clk) q <= ~q;
assign clk1 = q;
assign oe = 0;
assign dout = din;
endmodule
建议你不要大小写混用,代码里面全部用小写,只有宏或者parameter采用大写。 参考技术A 看看书吧,这么长的代码,懒得写了。追问
看样你会吧
依然谢谢
以上是关于谁能帮我注释一小段perl程序,尤其是if语句判断的是啥啊,while (<IN>) 是自动读一个字符串吗,存在哪里的主要内容,如果未能解决你的问题,请参考以下文章