之前一直以為chomp函數只是去掉字符串末尾的\n, 但是今天寫程序遇到一個bug,最后的原因就處在chomp上;
讀取fasta文件,內容如下:
>1 ATGCTAGCTACGTACGTACGTTTTTTTTT >2 ACGATCGACGATCGTACGTACGTACGATT >3 ATGCATGCTATACATCAGCTAATATCGCT
perl中$/代表默認的輸入記錄的分隔符;這里將$/設置為">":
#!/usr/bin/perl use warnings; use strict; my ($fasta) = @ARGV; open FASTA, $fasta or die "Can't open $fasta"; local $/ = ">"; while (<FASTA>) { s/\n//g; print qq{$_\n}; } close $fasta; $/ = "\n";
運行這段代碼,輸出結果如下:
> 1ATGCTAGCTACGTACGTACGTTTTTTTTT> 2ACGATCGACGATCGTACGTACGTACGATT> 3ATGCATGCTATACATCAGCTAATATCGCT
可以看出,$/的值出現在每行的最后;接下來使用chomp函數
#!/usr/bin/perl use warnings; use strict; my ($fasta) = @ARGV; open FASTA, $fasta or die "Can't open $fasta"; local $/ = ">"; while (<FASTA>) { chomp; s/\n//g; print qq{$_\n}; } close $fasta; $/ = "\n";
輸出結果為:
1ATGCTAGCTACGTACGTACGTTTTTTTTT 2ACGATCGACGATCGTACGTACGTACGATT 3ATGCATGCTATACATCAGCTAATATCGCT
第一行因為是空行,這里沒顯示出來;可以看到每行末尾的>符號被去除了,所以chomp的真正作用是去除字符串末尾的$/,只是因為默認情況下
$/為\n,造成chomp就是去除\n的假象;