perl 学习感想:
从7月10号入职至今,已经完成了三道练习题。
自上周完成两道之后,本以为这周可以飞速完成剩余题目,在这周初就真香警告,写剩余题目的时候,犯了很多低级错误。之前的题目虽然做出来了,但是还是相当不熟悉,很多东西不能灵活应用,不会变换,理解得不够深入透彻。并且很多基础知识还没学习到。所以决定慢下脚步,开始复习总结并看书继续学习基础知识。
之前代码总结
外部定义参数
特别注意:
1 各种符号: 第一行注意引号,括号最后加引号,括号中注意逗号与引号,=>符号
2 : 与 = 区别,:表示这个参数可有可无,=表示这个参数必须有
3 s表示后接的参数为字符串,i表示后接的参数为整数,f表示后接的参数为浮点数
my ($infile,$outfile,$position,$sta_end,$help);
GetOptions(
"i|infile=s "=> \$infile,
"o|outfile=s "=> \$outfile,
#如果需要输入不同文件,并生成的文件名与输入文件相关,则可以把此项去掉,在脚本中定义$filename =$infile.$b($b为文件数量计数器),具体操作可见联系第三题45-47行代码
"p|position=i" => \$position,
"se|sta_end=s" => \$sta_end,
#如果外部参数格式为num1-num2,在后续代码中,可以($s,$e)=split"-",$sta_end,对num1与num2进行操作,具体内容详见练习题第二题
"h|help:s" => \$help,
);
读取文件并写入文件
- 主程序按行读文件,创建数组
#读取外部参数传来的文件,并将每行以空格分隔的内容定义为数组
open F,"$infile" or die $!;
while (my $line =){
chomp $line;
my @content=split " ",$line; #一行有多个元素,
$id .= "$line-"; #一行只有一个元素,
}
close F ;
#注意每有一个open对应一个close
- 子程序读取文件内容,创建哈希(原始格式为excle表)
#子程序读取外部输入文件,并新建哈希(这个原始文件为excle,题目中还有原始文件为fa格式文件)
read_file($infile)
sub read_file{
my $file = shift;
#或者 my $file = $_[0] 外部传入的参数为一个文件名,即为一个字符串,这个命令的意思是将外部传入的内容取第一个元素赋值给$file,
open F, $file or die $!; #将名为$file的文件句柄赋值给F,打开这个文件内容
my %hash;
while (my $line=){
chomp $line;
($tmp1,$tmp2)= split " ",$line;
$key .=$tmp1;
$value .=$tmp2;
$hash{$key} = $value;
#哈希的key为文件第一列,value为文件第二列
}
close F;
return ...
}
- 子程序读取文件内容,创建哈希(原始格式为fa),还可以把分行的序列归一行(加不加chomp)
my %hash2 = read_fa($infile1);
sub read_fa{
my $file = shift;
open F, $file or die $!;
my %hash;
my($id,$gene,$seq);
while (my $line=){
chomp $line; #至现在代码与上个相同
if ($line =~ /^>/){
($id,$gene) = split " ", $line;
$id =~ s/>//;
}else{
$seq .=$line;
}
$hash{$id} = $seq;
close F;
return %hash;
}
在脚本内部新建文件并写入内容
open OUT ,">$outfile" or die $!;
my $locseq =...;定义$locseq为相应内容
print OUT "$locseq\n";
close OUT ;
#可以将$locseq内容写入outfile中
foreach while if 用法总结
- foreach+if :遍历数组中每个元素,判断数组中元素是否符合某种条件,由于foreach可以循环花括号内容,if在{}中因此可以多次判断,而if判断本身不能循环。
#例子 1
my $sum1=0;
foreach (keys %hash){
if (($_>=18)and($_<=30)){
$sum1 += $hash{$_};
print "$sum1\n";
}
}
#例子 2
open OUT,">$outfile" or die $!;
my $seq2;
foreach (@testid2){
if (exists $hash2{$_}){
$seq2 =$hash2{$_};
print OUT "$_\n$seq2\n";
}
}
#close F;
close OUT;
- while + if :while可用于按行读取文件中内容,while本身自带循环与判断,在这种用法中while判断的为:非文件的最后一行,符合条件时,对此行进行{}内操作,进行相应操作后,再判断是否为文件最后一行,,如此循环往复,直至读到文件最后一行停止while
if来判断当前读取的行是否符合某种条件,由于if在while{}中因此可以多次判断,而if判断本身不能循环。
foreach与 while :foreach遍历数组中元素
while读取文件中每行内容
#例子
while (my $line=){
chomp $line; #至现在代码与上个相同
if ($line =~ /^>/){
($id,$gene) = split " ", $line;
$id =~ s/>//;
}else{
$seq .=$line;
}
练习题注意事项总结
- 第一题 :
id文件转化为数组,先行读文件 => 将追加输出的内容定义为标量(注意追加时"$test .= "$line-"),这样就很方便将其转化为数组(my @testid = split "-",$test) - 第二题:
可将外部输入参数在脚本中进行操作,注意$sta_end - 第三题:
1.定义计数器;
写入文件行数的计数器,文件到达一定行数后重置计数器,
读取文件行数的计数器,
输出文件个数的计数器,每个输出文件有不同名字
2.脚本中定义了 与输入文件名相关的输出文件名
#截取代码命名的一部分:
sub cut_seqcount{
my $filena =shift;
my $filename=$filena.$b;
open OUT,">$filename" or die $!;
3.不同文件定义了相同文件句柄的巧妙应用,只要上一个打开文件关闭,文件句柄定义的变量就失效了,即:并非一个脚本中只能有不同文件句柄的名字
数据下载
使用OSS浏览器下载 ==> 用filezilla(选择sttp)传到服务器上
Teamviewer?
LncRNA质控流程
大致流程:小部分比对 ==> 过滤数据(去低质量,接头,N) ==> 全局比对 ==> 未比对上的分析来源 ==> 出质控报告