2019-07-28本周总结

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) ==> 全局比对 ==> 未比对上的分析来源 ==> 出质控报告

你可能感兴趣的:(2019-07-28本周总结)