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[ ... ];
hereの配列スライスを@values
返します。つまり、インデックスのリストで評価し、値のリストを返します。
map ... => 0 .. $#values
ここでは、@values のすべてのインデックスから計算した値のリストを返しています。0 が最初で$#values
最後です。
+($_ + $i) % @values
これが、これらのインデックスで行うことです。この+
記号は、括弧が の引数の括弧ではないことを perl に伝えるためにのみ使用されますmap
。インデックスに $i を追加し、> $#values
それが の長さでモジュロ除算されるのを防止し@values
ます。は 2 番目のオペランドをスカラー コンテキストで評価し、配列はスカラー コンテキストでその長さを評価するlength @values
ため、ここで呼び出すことは重要ではないことに注意してください。%
hello
またはのようなもの1110
をリストに変換してスカラーに戻す簡単な演習として、あなたに任せます。