我在一个脚本中有一些非常奇怪的行为,我写了很多年,但是由于某种原因,无法在一个特定的文件上运行。
由于意识到脚本无法识别应该在散列中的键,我添加了一些测试打印语句来读取这些键。我的常规策略是在变量前后放置星号,以检测潜在的隐藏字符。显然,这些键已经损坏。相关代码块:
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 "$ID\n";
print "*$ID**\n";
}
这会产生下列输出:
supercont3
**upercont3
Mitochondrion
**itochondrion
Chr1
**hr1
Chr2
**hr2
Chr3
**hr3
Chr4
**hr4
通常,我会怀疑其中涉及到“非法”换行符。然而,我手动替换了输入文件中的所有换行符,试图解决这个问题。输入文件中的什么可能导致脚本以这种方式执行?我可以想象,尽管我做了很多努力,ID变量后面仍然有一个非法换行符,但为什么第一个星号,也不打印双星号后面的换行符,为什么在行首打印双星号的方式会覆盖第一个星号以及变量“value”的前两个字符?
1条答案
按热度按时间r7xajy2e1#
当你看到这些效果时,看看文件或hexdump中的数据,如果终端解释了退格、回车和ansi序列,它就会隐藏数据。
这里有一个简单的例子。我回显
a
,b
,回车,然后c
。我的终端看到回车,并将光标移到行首。之后,输出继续。c
屏蔽了a
:使用十六进制转储,我可以看到表示回车的
0d
:此外,当您尝试从
$Seq
中删除“任何类型的换行符”时,您可能只删除垂直空格:您也可以使用generalized newline来