簡體   English   中英

Perl在substr()末尾添加CR

[英]Perl adding CR at end of substr()

我這樣做是為了限制文本行的大小。 $Line=substr($_,0,12) 但是,如果發生截斷,則返回的字符串結尾將缺少CR。 沒有截斷,一切都OK。 因此,當我打印行時,被截斷的行沒有CR,行繼續並出現亂碼。 是否有任何內置功能可以自動執行此操作,還是需要額外的if-clause來解決此問題? 謝謝格特。

我認為您的意思是0A行( 0A )而不是回車( 0D )。

解決方案是在截斷行之前刪除現有的換行符,然后再重新添加。

chomp;
$_ = substr($_, 0, 12);
say;

當然,您也可以使用串聯( $_ .= "\\n"; )。

單程

$line =~ s/(.{12}).*/$1/;

或更好

$line =~ s/.{12}\K.*//;

\\K刪除所有先前的匹配項; 請參見perlre中擴展模式中的“環視 斷言 ”。 此后,換行符仍然存在. 不匹配。 假定換行確實確實是“行”上的最后一件事。

但是,我發現剝離這些換行符並使用您的字符串更簡單。 然后在需要時添加換行符(大概是要打印)。


由於該行在OP中的$_中,因此實際上

s/.{12}\K.*//;

或者,如果我們也想借此機會將(截斷的)行分配給詞匯

my $line = s/.{12}\K.*//r;

/r修飾符使它返回更改后的字符串。 感謝ysth和ikegami的評論。


這篇文章最初聲明“ 啟動regex引擎可能比substr + append昂貴 ”,這是substr的更新(逆向)。

我的基准測試表明,相比之下,正則表達式明顯更快

$_ = substr($_, 0, 12) . "\n";

s/.{12}\K.*//;

確切的基准測試結果在細節上有所不同,因為這是一項操作如此之快,開銷會影響基准測試。 但是我發現regex總是快(快)超過50%。

$Line=substr($_,0,12)如果$ _長度大於12。如果使用此代碼截斷會發生$_值從線讀出來,它通常具有一個換行\\n在然后結束。 當截斷發生時,這當然會被刪除。 您可以做的是手動添加:

if (length $_ > 12) {$Line .= "\n";}

或者你可以做chomp截斷字符串之前

chomp;
$Line  = substr($_,0,12);
$Line .= "\n";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM