ある配列をある場所で切ってお尻と頭をくっつけた配列を作る
(a,b,c,d,e,f,g,h,i,j) という配列から、たとえば (e,f,g,h,i,j,a,b,c,d) という配列を作る。
use strict; use warnings; sub flip { my ($array_ref, $cut_index) = @_; return @{$array_ref} if $cut_index <= 0; my $max_index = $#{$array_ref}; return @{$array_ref} if $cut_index > $max_index; return (@{$array_ref}[$cut_index..$max_index], @{$array_ref}[0..$cut_index-1]); } my @x = split q//, q/abcdefghij/; print join(",", flip(\@x, -2)), "\n"; print join(",", flip(\@x, 0)), "\n"; print join(",", flip(\@x, 4)), "\n"; print join(",", flip(\@x, 9)), "\n"; print join(",", flip(\@x, 11)), "\n";
もっとすんなり書ける方法があるような気がしてならない。
実行結果。
[takeyuki@sunya ~]$ perl a.pl a,b,c,d,e,f,g,h,i,j a,b,c,d,e,f,g,h,i,j e,f,g,h,i,j,a,b,c,d j,a,b,c,d,e,f,g,h,i a,b,c,d,e,f,g,h,i,j
あと、Perl 的には負数を指定したときには後ろから数えて切るようにしたいところかな。