• 締切済み

perlでの三次元配列の作り方

perlで三次元配列をテキスト入力から作りたいのですが、例えば二次元配列の場合 foreach $line (@input) push @data, [split /[:]/, $line]; で@dataが二次元配列になるのですが、三次元配列の場合このあとに push @output, \@data; とするとリファレンスが同じであるためループをまわしてもうまく三次元になりませんよね。 解決法はありますでしょうか?

  • Perl
  • 回答数2
  • ありがとう数0

みんなの回答

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.2

いわゆるdeep copyをしたいわけでしょうか? Storableモジュールのdclone関数を使えばdeep copyしてくれると思います。 use Data::Dumper; use Storable qw(dclone); my (@data, @output); my @input = qw(1:2 a:b); foreach $line (@input) { push @data, [split /:/, $line]; push @output, dclone(\@data); } print Dumper \@output;

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

そもそも Perl だと foreach $line (@input) push @data, [split /[:]/, $line]; とは書けない. 本題は「リファレンスが同じになることが問題」であるなら「必ずリファレンスが違うようにすればいい」ということになる. 適切に my するのが最も簡単か. あと, push @data, [split /[:]/, $line]; には違和感がある. push @data, [split /:/, $line]; で十分では?

関連するQ&A

  • 二次元配列のつかいかた。

    配列の中に、同じ値があるかどうか、確認して、なければ データを渡すというようなプログラムを書きましたが、どうもうまくいきません.二次元配列が間違っているのだと思いますが、どこがいけないのでしょうか. my @databe=qw(aa:ee:rr:rr aa:rr:tt:aa dd:tt:dd:aa); my @nonumber=qw(ringo mikan tamago susi); my @check=();#not same contents my $p=0; my @array=(); foreach( @databe ){ my @f = split(/:/); my $i=0; foreach(@f){ push( @{$array[$p]}, $_); $i++; } $p++; } for(my $i=2;$i<$#nonumber;$i++){ for(my $p=0;$p<$#databe;$p++){ unless($array[0][$i] eq $array[$p][$i]){ push(@check, $i); } } } foreach( @databe ){ my @f = split(/:/); my %tmp; $tmp{GEBEN1}=$f[$check[0]];#html::template $tmp{GEBEN2}=$f[$check[1]];#html::template push( @alldata,\%tmp); } プログラム初心者です。自分なりに組んでみたのですがどうもうまくいきません. 分かる方御回答よろしくお願いします。

  • 二次元配列のforeachはどうすれば?

    <form action="form_check.php" method="POST"> <input type="checkbox" name="check[]" value="aaaa"> <input type="checkbox" name="check[]" value="bbbb"> <input type="checkbox" name="check[]" value="cccc"> <input type="submit" value="送信"> </form> フォームでこのように送りました このデータを受け取り、1つにまとめたいのですが foreach($_POST[check] as $val){ if($all){ $all .= ",".$val; }else{ $all = $val; } } このようにしてみたところ Warning: Invalid argument supplied for foreach() とエラーが出ました。 二次元配列でforeachのループをかけるときはどのように記述すればいいのでしょうか。

    • ベストアンサー
    • PHP
  • 要らない配列を無くしたい。Perl

    要素のない配列を消したいです。 do\n be\n usual\n become\n get\n look\n watch\n このような複数行の文があり"a"が入っている行だけ配列に突っ込みたいと思っています。 自分が試した方法として。 @line = split(/\n/,$content); とりあえず改行で区切り配列にぶち込んでいき。 foreach $line (@line){       unless ($line =~/a/){       $line = undef; } } その次に"a"が入っている以外の配列にundefを入れるようにしていました。 しかしこれだとundefが入っている配列がたくさん出来てしまい納得がいきません。 要素のない配列を消したいです。 どなたかご教授お願いします。

    • ベストアンサー
    • Perl
  • 多次元配列の扱い方

    PHPバージョン5.2.4を使っています。 次のような文字列が入っている多次元配列を foreachなどのループを使ってその値を取り出して扱いたいのですが、 取り出した値には配列(二次元以降の値)も含まれてるので 簡単には取り扱いできません・・・ print_rやvar_dumpを使えば値は全て表示されるのですが、 あくまで表示ではなくて値を取り扱いたいのです。 そのようなことができる関数などはあるのでしょうか? $arr[0][0] = 'a'; $arr[0][1] = 'b'; $arr[1] = 'c'; $arr[2][0][0][0] = 'd'; $arr[2][0][0][1] = 'e'; foreach ($arr as $value) { $value//←ここで値を扱いたいけど、配列も含まれてるので・・・ }

    • 締切済み
    • PHP
  • テキストファイルを二次元配列に

    お世話になります。 テキストファイルを1行ずつ読み込んで二次元配列に格納するプログラムですが、 //最大行数 #define LINE_MAX 10 //行内最大文字数 #define INPUT_MAX 128 char str[LINE_MAX][INPUT_MAX]; というようにして実現しています。 これを行数が分からないテキストファイルでも大丈夫なようメモリを動的に確保したいと考えています。 二つの次元の内、一つを動的に確保するにはどのようにしたら良いでしょうか。

  • LISPではperlのforeachをどのように書くのでしょうか?

    LISPでの以下の配列の配列、(LISPでは何て呼ぶのかな?)の ひとつひとつの要素を表示させたいです。 (setq dat'( ( 1 2 3 4 5) ( 6 7 8 9 10) (11 12 13 14 15) ) ) LISPではperlのforeachをどのように書くのでしょうか? # Perlの場合 foreach(@pos){ foreach($_){ print "$_\n"; } } また、配列のサイズ今回の場合は1次元配列では3,2次元配列ではサイズが5ですが、LISPで配列のサイズを求める方法も知りたいです。

  • 多次元連想配列の削除

    初めまして、自分でhpを持ちたく、Perlの勉強をしておりますパールマンと申します。 連想配列の連想配列で、下記のような $nihon = {      'tokyo' => {            'setagaya' => 1,            'shibuya' => 1            },      'osaka' => {            'namba' => 1,            'kitashinchi' => 1            }, 多次元連想配列を作ったとして、 この「%nihon」自体を削除したいのですが、どのようにしたら良いのでしょうか? delete %nihon や undef %nihon としても、ループ処理でキーを取り出すと物が残っており困っています。 どうもこの多次元配列自体が「リファレンス」というもで、、、 delete %nihon や undef %nihon はスッゲェ見当外れ、つぅか%nihonは別モンですよ。みたいなとこまではボンヤリわかってきたのですが…。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • 多次元配列への格納

    よろしくお願いします。 多次元配列に値を格納したいのですが、これまでは、 $test = array ( 'father' => array ('hiroshi', 'toshi'), 'mother' => array ('hanako', 'yoshiko'), ); のように予め書かれてあるデータを使ってきましたが、この度やりたいのはある一つの通常の配列を20ずつ多次元配列に自動的に格納するスクリプトを作りたいと思っています。 $test = array ('hiroshi','toshi','masao',.....);と続く配列を、 $test = array ( 0 => array ('hiroshi',......(20個)), 1 => array (.......), ); と20ぐらいに区切って多次元配列にしたいです。 $test[0]に直接pushしたらWarning: array_push() [function.array-push]: First argument should be an array in..と叱られてしまいました。 どなたかわかる方がいましたらおしえてください。

    • ベストアンサー
    • PHP
  • Perl:hiddenタグを使って二次元配列を保持する方法

    Perlで、ショッピングカートのようなもの(厳密には違いますが)を 作成しております。複数画面に渡ってユーザが必要事項を入力する際の データの受け渡し方法で、どうにも詰まってしまいました。 フォームに <input type="hidden" name="hoge" value=(二次元配列)> のような形で二次元配列を埋め込み、配列の値を一連の処理のあいだ中 保持・利用したいのですが、hiddenタグに上手く配列を格納することが できません。 配列を一要素ずつ展開してhiddenに入れれば実現できましたが、要素数が 多くなる場合も考えると、できればその方法は避けたいと思います。 PerlはWebと参考書で独学で勉強しているため、(私が見つけられないだけで) オーソドックスな方法があるのではと思い質問させていただきました。 検索キーワードなどでも結構ですので、何かアドバイスいただければ幸いです。 よろしくお願い致します。

専門家に質問してみよう