簡體   English   中英

如何在Perl中“從背面”對文本進行分塊。

[英]How to chunk text “from the back” in perl.

我正在編寫代碼,將perl中(從頭到尾或從​​右到左)的(大)文本字符串分成相等大小的塊(其余部分放在前面)。

它正在工作,但是這似乎是perl的“容易(快速)(概念上)做簡單的事情”范式破裂的情況。

我發現的最優雅的方法是從此處改編而成: 如何顯示帶有逗號的大數字? 的HTML

my @a = split /(?=(?:.{8})+$)/,$a;

但這很慢,因為字符串很大,可能是由於所有必要的回溯。 使用相同的想法(或任何正則表達式)是否可能有更有效的方法?

我出於類似的效率低下的考慮,一發不可收拾地拒絕了“反向輸入,正向處理,反向輸出”的想法。 但是,如果有人對此有所了解,我歡迎對這些問題進行糾正。

我確實做了一個蠻力的“ substr的迭代”實現,這很好,但是很不優雅。

使用我目前正在運行的unpack的實現,其優雅程度略微降低,但速度也稍快,改編自此處: 在Perl中將字符串拆分為等長塊

use integer;
my $la = length($a);
my $r = $la % 8;
my @a = unpack(($r?"a$r":"")."(a8)"x($la/8), $a);

真是丑。 即使看似簡單的"(a8)*" (而不是x )也失敗了,因為由於某種原因,在長度小於8的情況下(例如5),perl在末尾給出了一個額外的"" ,而解壓縮模板為"a5(a8)*" (有人對此“功能”有一個解釋嗎?:-S)

在沒有引入效率低下的情況下,是否有更好的簡化想法? 謝謝。

最佳測試:

use integer;
my $la = length($a);
my $r = $la % 8;
my @a = unpack(($r?"a$r":"")."(a8)".($la/8), $a);

似乎沒有更干凈的方法可以有效地做到這一點。

說明:

use integer; 因此($la/8)被截斷為整數。 int($la/8)會做同樣的事情。

$r是“余數”,即將其“划分”為8的塊后剩余的字符串量。

如果字符串可以被8整除( $r==0 ),則在unpack的模板中不得包含“剩余”部分,否則為"a$r"($r?"a$r":"")

unpack模板的“商”或“分塊”部分是: "(a8)".($la/8)

最后一行可以替換為以下代碼,以使代碼看起來更簡潔,但需要增加一些變量:

my $q = $la / 8;
my $tr = $r ? "a$r" : "";
my @a = unpack "$tr(a8)$q", $a;

暫無
暫無

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

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