簡體   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