要點(diǎn)一:文件讀寫(xiě)
文件讀寫(xiě)主要使用open
函數(shù)逻炊,如下圖使用方法分為三個(gè)部分:
文件讀入
1、文件句柄
- 可以理解呈擺渡船慢宗,讀取文件數(shù)據(jù)坪蚁,再轉(zhuǎn)移給腳本中的變量。
- 自己命名婆廊,一般大寫(xiě)字母迅细;如圖例中的
IN
,OU
- perl常用默認(rèn)文件句柄
STDIN
,STDOUT
,STDERR
分別表示屏幕標(biāo)準(zhǔn)輸入、輸出淘邻、報(bào)錯(cuò)茵典。
ARGV
表示命令行參數(shù);比如ARGV[0]
表示命令行第一個(gè)參數(shù)宾舅;ARGV[1]
表示命令行第二個(gè)參數(shù).......
值得注意的是统阿,因?yàn)槭侵鹦?擺渡"的彩倚,所以
IN
第幾次在腳本中出現(xiàn)就表示文件中的第幾行出現(xiàn)。如果不想使用第一行數(shù)據(jù)扶平,賦值給空變量即可帆离。見(jiàn)本文最后的例子。
2结澄、讀or寫(xiě)
類(lèi)比Linux重定向哥谷;
-
<
表示讀入文件 -
>
表示寫(xiě)入文件 -
>>
表示追加寫(xiě)入文件 -
<>
磚石操作符,一般為將句柄賦值給變量的標(biāo)準(zhǔn)格式
$first=<IN>;
#如果磚石操作符為空麻献,就表示屏幕輸入中(鍵盤(pán)敲)讀取们妥,如下面這個(gè)加法計(jì)算小例子。
#!/usr/bin/perl -w
print "Please enter the first number\n";
chomp ($a=<>);
print "Please enter the second number\n";
chomp ($b=<>);
$c=$a+$b;
print "$a + $b =$c\n";
3勉吻、文件名
為待讀取的文件或者準(zhǔn)備寫(xiě)入的新文件名监婶,一般配合ARGV
從參數(shù)中讀取。
常用的標(biāo)準(zhǔn)模式為
open IN,"<$ARGV[0]"; #第一個(gè)參數(shù)設(shè)置讀入的文件
open OU,">$ARGV[1]"; #第二個(gè)參數(shù)設(shè)置寫(xiě)入的文件
4齿桃、優(yōu)雅的補(bǔ)充 or die
考慮到有時(shí)文件無(wú)法打開(kāi)的現(xiàn)象惑惶,可以在結(jié)尾補(bǔ)充說(shuō)明性的報(bào)錯(cuò)信息
open IN,"<$ARGV[0]" or die "can not open the file\n$!";
-
$!
為特殊變量短纵,表示報(bào)錯(cuò)信息带污。
此外還有兩個(gè)特殊變量,這里一并介紹踩娘。一個(gè)是
$/
表示分隔符刮刑,默認(rèn)分隔符為$/="\n"
(換行符),可以根據(jù)情況作出修改养渴,比如$/=">"
就將分隔符修改為大于號(hào)雷绢,在fasta序列處理中常用;一個(gè)是$_
一般為未指明變量時(shí)的默認(rèn)變量理卑,例子見(jiàn)下例翘紊。
5、遍歷文件行
- 將結(jié)果輸出到屏幕
open IN,"<$ARGV[0]";
while (<IN>) { #while判斷依據(jù):是否為空字符串
chomp; #去掉換行符藐唠;當(dāng)為默認(rèn)變量$_時(shí)可省略
print "$_/n"; #輸出結(jié)果到屏幕
}
close IN; #關(guān)閉句柄
- 將結(jié)果輸出到指定文件
open IN,"<$ARGV[0]";
open OU,">$ARGV[1]";
while (<IN>) {
chomp;
print OU "$_/n"; #輸出結(jié)果不會(huì)輸出到屏幕帆疟,而是指定輸出文件中
}
close IN; #關(guān)閉句柄
close OU;
要點(diǎn)二:實(shí)戰(zhàn)小例子 fastq→fasta
首先要理解兩種文件的區(qū)別---
(1)fastq有四行,第一行開(kāi)頭為@
;
(2)fasta只有兩行宇立,第一行開(kāi)頭為>
踪宠。
因此要將fastq的三四兩行刪去,同時(shí)將第一行的@
更換為>
妈嘹。
#!/usr/bin/perl -w
open IN,"<$ARGV[0]"; #為讀入的fastq文件
# open IN,"zcat $ARGV[0] |" #若為壓縮文件fq.gz的讀入方法
open OU,">$ARGV[1]"; #為寫(xiě)出的fasta文件
while ($id=<IN>) {
chomp ($id); #要加入括號(hào)柳琢,因?yàn)樽兞坎皇悄J(rèn)變量,不可省略
$id=~ tr /@/>/ ; #將@替換為>
chomp ($seq=<IN>);
<IN>; #第三行不管,賦值給空變量
<IN>; #第四行不管柬脸,賦值給空變量
print OU "$id\n";
print OU "$seq\n";
}
close IN; #關(guān)閉句柄
close OU;
head test.1.fq
test.1.fq
perl -c 1.pl
perl 1.pl test.1.fq my.fa
head my.fa
my.fa