繁体   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