我编写并使用了多年的脚本中有一些非常奇怪的行为,但由于某种原因,无法在一个特定的文件上运行。
认识到脚本无法识别应该在散列中的键,我添加了一些测试打印语句来读取键。我通常的策略是在变量前后放置星号,以检测潜在的隐藏字符。很明显,这些密钥已经损坏了。相关代码块:
foreach my $fastaRecord (@GenomeList) {
my ($ID, $Seq) = split(/n/, $fastaRecord, 2);
# uncomment next line to strip everything off sequence
# header except trailing numeric identifiers
# $ID =~ s/.+?(d+$)/$1/;
$Seq =~ s/[^A-Za-z-]//g; # remove any kind of new line characters
$RefSeqLen = length($Seq);
$GenomeLenHash{$ID} = $RefSeqLen;
print "$IDn";
print "*$ID**n";
}
这会产生以下输出:
supercont3
**upercont3
Mitochondrion
**itochondrion
Chr1
**hr1
Chr2
**hr2
Chr3
**hr3
Chr4
**hr4
通常情况下,我会怀疑这是"非法的"。涉及换行字符。但是,我手动替换了输入文件中的所有换行符来尝试解决这个问题。输入文件中的哪些内容可能导致脚本以这种方式执行?我可以想象,也许,尽管我的努力,仍然有一个非法的换行符在ID变量之后,但是为什么没有第一个星号,也没有双星号之后的换行符不打印,为什么双星号在行开头打印的方式覆盖了第一个星号以及变量&;value&;的前两个字符?
当您看到这些效果时,请查看文件或hexdump中的数据。如果终端解释退格、回车和ansi序列,那么它将隐藏数据。
% perl script.pl | hexdump -C
这里有一个简单的例子。我回显a
,b
,回车,然后是c
。我的终端看到回车,就把光标移到行首。之后,输出继续。c
掩盖a
:
% echo $'abrc'
cb
使用十六进制转储,我可以看到表示回车符的0d
:
% echo $'abrc' | hexdump -C
00000000 61 62 0d 63 0a |ab.c.|
00000005
同样,当你试图删除"任何类型的换行符"时从$Seq
,你可能只是删除垂直空白:
$target =~ s/v//g;
也可以使用通用换行符
$target =~ s/R//g;