perl 學(xué)習(xí)感想:
從7月10號(hào)入職至今造虏,已經(jīng)完成了三道練習(xí)題。
自上周完成兩道之后麦箍,本以為這周可以飛速完成剩余題目漓藕,在這周初就真香警告,寫剩余題目的時(shí)候挟裂,犯了很多低級(jí)錯(cuò)誤享钞。之前的題目雖然做出來(lái)了,但是還是相當(dāng)不熟悉诀蓉,很多東西不能靈活應(yīng)用栗竖,不會(huì)變換,理解得不夠深入透徹渠啤。并且很多基礎(chǔ)知識(shí)還沒(méi)學(xué)習(xí)到狐肢。所以決定慢下腳步,開(kāi)始復(fù)習(xí)總結(jié)并看書繼續(xù)學(xué)習(xí)基礎(chǔ)知識(shí)沥曹。
之前代碼總結(jié)
外部定義參數(shù)
特別注意:
1 各種符號(hào): 第一行注意引號(hào),括號(hào)最后加引號(hào)份名,括號(hào)中注意逗號(hào)與引號(hào)碟联,=>符號(hào)
2 : 與 = 區(qū)別,:表示這個(gè)參數(shù)可有可無(wú)僵腺,=表示這個(gè)參數(shù)必須有
3 s表示后接的參數(shù)為字符串鲤孵,i表示后接的參數(shù)為整數(shù),f表示后接的參數(shù)為浮點(diǎn)數(shù)
my ($infile,$outfile,$position,$sta_end,$help);
GetOptions(
"i|infile=s "=> \$infile,
"o|outfile=s "=> \$outfile,
#如果需要輸入不同文件辰如,并生成的文件名與輸入文件相關(guān)普监,則可以把此項(xiàng)去掉,在腳本中定義$filename =$infile.$b($b為文件數(shù)量計(jì)數(shù)器)丧没,具體操作可見(jiàn)聯(lián)系第三題45-47行代碼
"p|position=i" => \$position,
"se|sta_end=s" => \$sta_end,
#如果外部參數(shù)格式為num1-num2鹰椒,在后續(xù)代碼中,可以($s,$e)=split"-",$sta_end呕童,對(duì)num1與num2進(jìn)行操作漆际,具體內(nèi)容詳見(jiàn)練習(xí)題第二題
"h|help:s" => \$help,
);
讀取文件并寫入文件
- 主程序按行讀文件,創(chuàng)建數(shù)組
#讀取外部參數(shù)傳來(lái)的文件,并將每行以空格分隔的內(nèi)容定義為數(shù)組
open F,"$infile" or die $!;
while (my $line =<F>){
chomp $line;
my @content=split " ",$line; #一行有多個(gè)元素夺饲,
$id .= "$line-"; #一行只有一個(gè)元素奸汇,
}
close F ;
#注意每有一個(gè)open對(duì)應(yīng)一個(gè)close
- 子程序讀取文件內(nèi)容,創(chuàng)建哈希(原始格式為excle表)
#子程序讀取外部輸入文件往声,并新建哈希(這個(gè)原始文件為excle擂找,題目中還有原始文件為fa格式文件)
read_file($infile)
sub read_file{
my $file = shift;
#或者 my $file = $_[0] 外部傳入的參數(shù)為一個(gè)文件名,即為一個(gè)字符串浩销,這個(gè)命令的意思是將外部傳入的內(nèi)容取第一個(gè)元素賦值給$file,
open F, $file or die $!; #將名為$file的文件句柄賦值給F贯涎,打開(kāi)這個(gè)文件內(nèi)容
my %hash;
while (my $line=<F>){
chomp $line;
($tmp1,$tmp2)= split " ",$line;
$key .=$tmp1;
$value .=$tmp2;
$hash{$key} = $value;
#哈希的key為文件第一列,value為文件第二列
}
close F;
return ...
}
- 子程序讀取文件內(nèi)容慢洋,創(chuàng)建哈希(原始格式為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=<F>){
chomp $line; #至現(xiàn)在代碼與上個(gè)相同
if ($line =~ /^>/){
($id,$gene) = split " ", $line;
$id =~ s/>//;
}else{
$seq .=$line;
}
$hash{$id} = $seq;
close F;
return %hash;
}
在腳本內(nèi)部新建文件并寫入內(nèi)容
open OUT ,">$outfile" or die $!;
my $locseq =...塘雳;定義$locseq為相應(yīng)內(nèi)容
print OUT "$locseq\n";
close OUT ;
#可以將$locseq內(nèi)容寫入outfile中
foreach while if 用法總結(jié)
- foreach+if :遍歷數(shù)組中每個(gè)元素,判斷數(shù)組中元素是否符合某種條件普筹,由于foreach可以循環(huán)花括號(hào)內(nèi)容败明,if在{}中因此可以多次判斷,而if判斷本身不能循環(huán)太防。
#例子 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可用于按行讀取文件中內(nèi)容妻顶,while本身自帶循環(huán)與判斷,在這種用法中while判斷的為:非文件的最后一行蜒车,符合條件時(shí)讳嘱,對(duì)此行進(jìn)行{}內(nèi)操作,進(jìn)行相應(yīng)操作后酿愧,再判斷是否為文件最后一行呢燥,,如此循環(huán)往復(fù)寓娩,直至讀到文件最后一行停止while
if來(lái)判斷當(dāng)前讀取的行是否符合某種條件叛氨,由于if在while{}中因此可以多次判斷呼渣,而if判斷本身不能循環(huán)。
foreach與 while :foreach遍歷數(shù)組中元素
while讀取文件中每行內(nèi)容
#例子
while (my $line=<F>){
chomp $line; #至現(xiàn)在代碼與上個(gè)相同
if ($line =~ /^>/){
($id,$gene) = split " ", $line;
$id =~ s/>//;
}else{
$seq .=$line;
}
練習(xí)題注意事項(xiàng)總結(jié)
- 第一題 :
id文件轉(zhuǎn)化為數(shù)組寞埠,先行讀文件 => 將追加輸出的內(nèi)容定義為標(biāo)量(注意追加時(shí)"$test .= "$line-"),這樣就很方便將其轉(zhuǎn)化為數(shù)組(my @testid = split "-",$test) - 第二題:
可將外部輸入?yún)?shù)在腳本中進(jìn)行操作屁置,注意$sta_end - 第三題:
1.定義計(jì)數(shù)器;
寫入文件行數(shù)的計(jì)數(shù)器仁连,文件到達(dá)一定行數(shù)后重置計(jì)數(shù)器蓝角,
讀取文件行數(shù)的計(jì)數(shù)器,
輸出文件個(gè)數(shù)的計(jì)數(shù)器饭冬,每個(gè)輸出文件有不同名字
2.腳本中定義了 與輸入文件名相關(guān)的輸出文件名
#截取代碼命名的一部分:
sub cut_seqcount{
my $filena =shift;
my $filename=$filena.$b;
open OUT,">$filename" or die $!;
3.不同文件定義了相同文件句柄的巧妙應(yīng)用使鹅,只要上一個(gè)打開(kāi)文件關(guān)閉,文件句柄定義的變量就失效了昌抠,即:并非一個(gè)腳本中只能有不同文件句柄的名字
數(shù)據(jù)下載
使用OSS瀏覽器下載 ==> 用filezilla(選擇sttp)傳到服務(wù)器上
Teamviewer患朱?
LncRNA質(zhì)控流程
大致流程:小部分比對(duì) ==> 過(guò)濾數(shù)據(jù)(去低質(zhì)量,接頭炊苫,N) ==> 全局比對(duì) ==> 未比對(duì)上的分析來(lái)源 ==> 出質(zhì)控報(bào)告