繁体   English   中英

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

[英]Compound print statement overwrites part of variable

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

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

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";

}

这会产生以下 output:

supercont3
**upercont3
Mitochondrion
**itochondrion
Chr1
**hr1
Chr2
**hr2
Chr3
**hr3
Chr4
**hr4

通常,我会怀疑涉及“非法”换行符。 但是,我手动替换了输入文件中的所有换行符以尝试解决问题。 输入文件中的什么可能导致脚本以这种方式执行? 我可以想象,尽管我努力了,但 ID 变量后面仍然有一个非法换行符,但是为什么第一个星号和双星号之后的换行符都没有打印出来,为什么双星号打印在开头该行以覆盖第一个星号以及变量“值”的前两个字符的方式?

当您看到这些效果时,请查看文件或 hexdump 中的数据。 如果终端解释退格键、回车符和 ansi 序列,它将隐藏数据。

% perl script.pl | hexdump -C

这是一个简单的例子。 我回显ab ,回车,然后c 我的终端看到回车并将 cursor 移到该行的开头。 之后,output继续。 c掩盖了a

% echo $'ab\rc'
cb

通过十六进制转储,我可以看到代表回车的0d

% echo $'ab\rc' | hexdump -C
00000000  61 62 0d 63 0a                                    |ab.c.|
00000005

此外,当您尝试从$Seq中删除“任何类型的换行符”时,您可能只删除垂直空格:

$target =~ s/\v//g;

您也可以使用通用换行符

$target =~ s/\R//g;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM