复合打印语句覆盖变量的一部分



我编写并使用了多年的脚本中有一些非常奇怪的行为,但由于某种原因,无法在一个特定的文件上运行。

认识到脚本无法识别应该在散列中的键,我添加了一些测试打印语句来读取键。我通常的策略是在变量前后放置星号,以检测潜在的隐藏字符。很明显,这些密钥已经损坏了。相关代码块:

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;

最新更新