perl初心者です。すみませんが以下のようなことがしたいです。方法を教えてください。


以下の配列がある。
@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の要素数に応じた配列が複数できるように。)

#説明べたですみません。どうでしょうか。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/07/21 18:25:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Craftworks No.3

回答回数20ベストアンサー獲得回数6

ポイント23pt

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;
}

その他の回答3件)

id:tombe No.1

回答回数38ベストアンサー獲得回数7

ポイント22pt
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);
id:luckycorner

Data::Dumperモジュールってのがあるのですね。

2009/07/21 18:22:46
id:Gosogoso No.2

回答回数3ベストアンサー獲得回数0

ポイント23pt

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++;

}

}

id:Craftworks No.3

回答回数20ベストアンサー獲得回数6ここでベストアンサー

ポイント23pt

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;
}
id:sakuragaoka No.4

回答回数17ベストアンサー獲得回数3

ポイント22pt

こんな感じでいかがでしょう?

  • コード
#!/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:

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません