我需要使用 Perl 循环移位一些字符/位
例如,使用以下输入(反转字符串):
1010
1110
hello
我需要获得:
0101
0111
olleh
如何使用 Perl 实现这一点?
好像你想反转一个字符串而不是循环移位!
$string=reverse($string);
但是,如果你真的想循环移位值,很容易编写一个函数来使用任意列表进行训练:
#!/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
行circular
:
return @values[ ... ];
我们在@values
这里返回一个数组切片,这意味着我们使用索引列表对其进行评估并返回值列表。
map ... => 0 .. $#values
我们在这里返回一个值列表,我们根据@values 的所有索引计算,0 是第一个,$#values
是最后一个。
+($_ + $i) % @values
这就是我们对这些索引所做的事情。该+
符号仅用于告诉 perl 括号不是map
. 我们将 $i 添加到索引中,并防止它变成> $#values
我们将它模除以 的长度@values
。请注意,length @values
在这里调用并不重要,因为%
在标量上下文中评估其第二个操作数,而在标量上下文中评估其长度的数组。
我把它留给你作为一个简单的练习来将你的东西转换为hello
或1110
列表并返回到标量。