[英]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.