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

qv7cva1a  于 2022-12-13  发布在  Perl
关注(0)|答案(1)|浏览(137)

我在一个脚本中有一些非常奇怪的行为,我写了很多年,但是由于某种原因,无法在一个特定的文件上运行。
由于意识到脚本无法识别应该在散列中的键,我添加了一些测试打印语句来读取这些键。我的常规策略是在变量前后放置星号,以检测潜在的隐藏字符。显然,这些键已经损坏。相关代码块:

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”的前两个字符?

r7xajy2e

r7xajy2e1#

当你看到这些效果时,看看文件或hexdump中的数据,如果终端解释了退格、回车和ansi序列,它就会隐藏数据。

% perl script.pl | hexdump -C

这里有一个简单的例子。我回显ab,回车,然后c。我的终端看到回车,并将光标移到行首。之后,输出继续。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;

您也可以使用generalized newline

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

相关问题