以下の配列がある。
@xx = ( "a", "b", "c", "d", "e", "f" ,"g" ,"h" ,"i" , "j" );
これを3つの要素を持つ、ことなる配列にしたい。(以下のような配列)
@xx1 = ( "a", "b", "c")
@xx2 = ( "d", "e", "f")
@xx3 = ( "g", "h", "i")
@xx4 = ( "j")
・最初の要素から3つづつカウントしていき、最後の配列は3つ以下でもかまわない。
・@xxの要素数は可変なので、spliceなどでいちいち何番目かを指定して切り取るのは避けたい。("3"という1つの配列に含める要素数を指定したら、@xxの要素数に応じた配列が複数できるように。)
#説明べたですみません。どうでしょうか。
while で要素数をチェックすれば splice でも可変に対応できます。
use strict; use warnings; use Data::Dumper; my @xx = ( "a" .. "j" ); my ( $three_array, $i ); while (@xx) { $three_array->[$i++] = [ splice @xx, 0, 3 ]; } print Dumper $three_array;
リストリファレンスにした方が、後で柔軟なデータ処理ができます。
理由があって、配列にしたいなら、以下のように動的に定義でしょうか。
while (@xx) { no strict 'refs'; @{"xx" . $i++} = splice @xx, 0, 3; }
use Data::Dumper; my $num = 3; my @xx = qw(a b c d e f g h i j); my @yy = (); push(@yy,[splice(@xx,0,$num)]) while @xx; print Dumper(\@yy);
Perl ならもうチョイ簡潔にやれそうですが
@xx = ( "a", "b", "c", "d", "e", "f" ,"g" ,"h" ,"i" , "j" );
$no = $cnt = 0;
foreach $tmp ( @xx ) {
push @{"xx${no}"}, $tmp;
$cnt++;
if ( $cnt >= 3 ) {
$cnt = 0;
$no++;
}
}
while で要素数をチェックすれば splice でも可変に対応できます。
use strict; use warnings; use Data::Dumper; my @xx = ( "a" .. "j" ); my ( $three_array, $i ); while (@xx) { $three_array->[$i++] = [ splice @xx, 0, 3 ]; } print Dumper $three_array;
リストリファレンスにした方が、後で柔軟なデータ処理ができます。
理由があって、配列にしたいなら、以下のように動的に定義でしょうか。
while (@xx) { no strict 'refs'; @{"xx" . $i++} = splice @xx, 0, 3; }
こんな感じでいかがでしょう?
#!/usr/bin/perl #--- 初期設定 my @xx = ( "a", "b", "c", "d", "e", "f" ,"g" ,"h" ,"i" , "j" ); my $x = 3; # いくつづつに分けるかをここで決める #--- 処理メイン my $i = 0; # @xxの中で何個目か数えるカウンタ foreach(@xx){ # @xxの中の一つづつの処理 $num = int($i/$x) + 1; # 何番目の@xx○に入れるか判断。$numに○の数字が入る print "$_ : $numに入ります\n"; # 処理を目で見るため push(@{'xx'. $num}, $_); # @xx○にコピー $i++; } #--- 以下は結果を表示するため print "xx1: " . join(" ",@xx1) . "\n"; print "xx2: " . join(" ",@xx2) . "\n"; print "xx3: " . join(" ",@xx3) . "\n"; print "xx4: " . join(" ",@xx4) . "\n"; print "xx5: " . join(" ",@xx5) . "\n"; print "xx6: " . join(" ",@xx6) . "\n"; exit;
$ perl test.pl a : 1に入ります b : 1に入ります c : 1に入ります d : 2に入ります e : 2に入ります f : 2に入ります g : 3に入ります h : 3に入ります i : 3に入ります j : 4に入ります xx1: a b c xx2: d e f xx3: g h i xx4: j xx5: xx6:
Data::Dumperモジュールってのがあるのですね。