人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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


●質問者: smith000
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Perl すみません どうでしょう カウント 初心者
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● tombe
●22ポイント
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);
◎質問者からの返答

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


2 ● Gosogoso
●23ポイント

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

}

}


3 ● Craftworks
●23ポイント ベストアンサー

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

4 ● 桜ヶ丘
●22ポイント

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

#!/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:
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ