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