我需要使用Perl循环移位一些字符/位
例如,使用以下输入(反转字符串):
1010
1110
hello
我需要获得:
0101
0111
olleh
如何使用Perl实现这一目标?
答案 0 :(得分:3)
好像你想要反转一个字符串而不是循环移位!
$string=reverse($string);
答案 1 :(得分:1)
但是,如果你真的想要循环移位值,那么很容易编写一个函数,用于训练任意列表:
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
# circular shift lists
sub circular {
my ($i, @values) = @_;
return @values[ map +($_ + $i) % @values => 0 .. $#values ];
}
say circular 4, 1 .. 9; # 567891234
say circular -2, 1 .. 9; # 891234567
say circular 3, split '' => 'hello'; # lohel
对return
的{{1}}行的几句解释:
circular
我们在这里返回return @values[ ... ];
的数组切片,这意味着我们使用索引列表对其进行评估并返回值列表。
@values
我们在这里返回一个值列表,我们从@values的所有索引计算,0是第一个,map ... => 0 .. $#values
是最后一个。
$#values
这就是我们对这些指数的处理方式。 +($_ + $i) % @values
符号仅用于告诉perl parantheses不是+
的参数paratheses。我们将$ i添加到索引中,并防止它变为map
,我们将其除以> $#values
的长度。请注意,在此处调用@values
并不重要,因为length @values
在标量上下文中计算其第二个操作数,并在标量上下文中计算数组的长度。
我将此作为一项简单的练习,将%
或hello
等内容转换为列表并返回标量。