之前一直以为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的假象;

  

  

05-11 11:04