之前一直以为chomp函数只是去掉字符串末尾的\n, 但是今天写程序遇到一个bug,最后的原因就处在chomp上;
读取fasta文件,内容如下:
>1ATGCTAGCTACGTACGTACGTTTTTTTTT>2ACGATCGACGATCGTACGTACGTACGATT>3ATGCATGCTATACATCAGCTAATATCGCT
perl中$/代表默认的输入记录的分隔符;这里将$/设置为">":
#!/usr/bin/perl use warnings;use strict;my ($fasta) = @ARGV;open FASTA, $fasta or die "Can't open $fasta";local $/ = ">";while () { 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 () { chomp; s/\n//g; print qq{ $_\n};}close $fasta;$/ = "\n";
输出结果为:
1ATGCTAGCTACGTACGTACGTTTTTTTTT2ACGATCGACGATCGTACGTACGTACGATT3ATGCATGCTATACATCAGCTAATATCGCT
第一行因为是空行,这里没显示出来;可以看到每行末尾的>符号被去除了,所以chomp的真正作用是去除字符串末尾的$/,只是因为默认情况下
$/为\n,造成chomp就是去除\n的假象;