![](/img/trans.png)
[英]Need help understanding how Perl 5 is parsing a compound assignment statement referencing same variable
[英]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
這是一個簡單的例子。 我回顯a
, b
,回車,然后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.