如何循环移位一些字符/位?

时间:2012-09-17 20:53:13

标签: string perl shift

我需要使用Perl循环移位一些字符/位

例如,使用以下输入(反转字符串):

1010
1110
hello

我需要获得:

0101
0111
olleh

如何使用Perl实现这一目标?

2 个答案:

答案 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等内容转换为列表并返回标量。