• ベストアンサー

perlの配列追加について

perlの配列の扱いについて質問です。 例えば、10個ほどの要素がある配列があるとして新しい要素を配列の任意の場所に追加する方法ってsplice関数を使うのが普通なのでしょうか? 本を参考にsplice関数を使ってみたら任意の場所に上書きのようになってしまいました(単に自分のやり方が悪いだけかもしれませんが)。 perlで簡単に配列の任意の場所へ、上書きではなく追加する方法をどなたか教えてください。 宜しくお願い致します。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • W_H
  • ベストアンサー率47% (21/44)
回答No.2

ループで配列の中身を読み込みながら別の新しい配列に値を入れ、その途中で、目的の場所になったらそこに入れたいデータを挿入するプログラムを書けばどうでしょうか。 $n=3;#どこに追加するか $dat="new";#新データ @arr=(0,1,2,3,4,5,6,7,8,9);#データを追加する配列 my(@new); --$n;#数字調整 for($a=0;$a<=$#arr;++$a){ if($a==$n){push(@new,$dat);}else{}#新データを入れる push(@new,$arr[$a]);#配列のデータを入れる。 } 大体こんな感じでしょうか。上三行は設定です。 適当に書いたサンプルなので、少し突っ込みどころとか間違いもあるかもしれません。他にも、while(@arr){}とshift(@arr)を使って、もう少し見た目すっきりにすることはできそうですね。 後アドバイスとして、関数に不満があったり、上手く動かなかったら、自作した方がいいですよ。

msak777
質問者

お礼

回答ありがとうございます。 関数があまり当てにならないので自作の方向で検討してみますw 何事も練習ということで、参考にさせてもらいます。

その他の回答 (1)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

spliceですねぇ。 http://www.rfs.jp/sb/perl/05/splice.html なにかを勘違いしちゃったんじゃないでしょうか? @Arr = qw|ab cd ef gh|; @Arr2 = qw|WX YZ|; splice @Arr,2,0,@Arr2; # @Arrの#2の位置から0個の要素を削除し、@Arr2を挿入する。 print "@Arr";# 結果 → ab cd WX YZ ef gh

msak777
質問者

補足

回答ありがとうございます。 やはりspliceを使うのが無難なのですねw ただ、再度試した結果やはり追加というより上書きのようになってしまいますorz 例> @array=(a,b,c,d,e); $test="test"; splice @array,2,0,$test; print @array; 結果は→a b ctest d e のような感じなってしまいます。 splice関数で何か注意点などがあれば教えてください お願いします。

関連するQ&A

  • 配列要素へのリファレンスと、要素の追加・削除について

    ActivePerl v5.8.8 build 820 を使用しています。 配列要素へのリファレンスを取得し、その後要素の追加又は削除を行った場合 元の要素を参照し続けます。 (1) 要素の追加 @list = qw/a b c d/; $p = \$list[1]; print("$$p\n"); splice(@list, 1, 0, 'x'); print("$$p\n"); # 'b' が表示される # $list[2] を参照 ($list[1] ではない) (2) 要素の削除 @list = qw/a b c d/; $p = \$list[1]; print("$$p\n"); splice(@list, 1, 1); print("$$p\n"); # 'b' が表示される 質問1 これは perl の仕様としての動作でしょうか? それとも、実行系やバージョン などの環境に依存するものでしょうか? 質問2 要素の削除の場合、削除直後なのでたまたま元の値が表示されただけで、 削除した要素 'b' が格納されたメモリ空間はいつ上書きされるかわからない 状態なのでしょうか? それとも、上書きされることはないのでしょうか?

    • ベストアンサー
    • Perl
  • 配列から任意の2つを削除するには?

    環境: WindowsXPsp2 Flash8 ActionScript2.0 配列から任意の2つの要素を同時に削除したいのですが、スクリプトがややこしくなりすぎているのでもっとスッキリと書けないものかと思っております。 例えば hairetuList = ["犬","猫","猿","ゾウ","キリン","パンダ"] という配列があったとします。そこから変数sentaku番目の要素を削除するだけなら hairetuList.splice(sentaku-1,1) となると思うのですが、 同時に2つ(sentakuAとsentakuB番目)を削除するとなると hairetuList.splice(sentakuA-1,1) hairetuList.splice(sentakuB-1,1) と記述してしまうと一つずつ削除される為、ずれてしまいうまくいきません。 そこでsentakuAとsentakuBの大きさを比べて if(sentakuA < sentakuB){ hairetuList.splice(sentakuA-1,1) hairetuList.splice(sentakuB-2,1) }else { hairetuList.splice(sentakuB-1,1) hairetuList.splice(sentakuA-2,1) } というように記述しました。 上記方法で思い通り動くのですが、もっと簡単に(ifなどを使わずに)出来るような気がするのですが思いつきません。 何か方法があるでしょうか?ご教授頂ければ幸いです。 よろしくお願い致します。

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

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

  • クリックで配列に追加する方法

    今は、更新ごとにjsファイルの配列を追加しています。 これをhtml側だけの変更で更新させたいです。 画像をクリックすることで、配列を追加させたい場合どのように記述すれば良いでしょうか。 よろしくお願いします。 ーーーーーーーーーーーーーーーー var zzz = [111,222 ];  //ここを追加しなくても良い方法をお願いします。 $.each(zzz,function(i, aaa){ if($.cookie('AAA')=="AAA_DATA"+aaa){ $(function(){ $("a#AAA img").attr("src","images/img_"+aaa+".jpg"); })} $(function(){ $("a#AAA_BTN"+aaa).click(function() { $("a#AAA img").attr("src","images/img_"+aaa+".jpg"); $.cookie("AAA","AAA_DATA"+aaa);}); }) }) ーーーーーーーーーーーーーーーー 【html】 <a id="AAA" 配列に追加させたい任意の数字?> <img="XXX.jpg"></a> <a id="AAA" 配列に追加させたい任意の数字?> <img="XXX.jpg"></a> <a id="AAA" 配列に追加させたい任意の数字?> <img="XXX.jpg"></a>

  • 配列のプログラム

    配列の要素が10個(記憶領域が10個)ある配列に先頭から任意の数字を代入するプログラムを作成したいのですが、全く手に終えません。 おおまかでもいいので、どなたかご存知でしたら教えてください。 よろしくお願い致します。

  • 配列の断面について

    substring関数を利用したり配列の要素を参照したりする時に、0~nと言うふうになっていますよね。 通常、ループ文などではインデックスを使うときに判りやすいように1~nというふうに取り扱いますが、配列の要素を参照・更新する際に(i-1)などとしなければなりません。配列を宣言する際に「0~」を「1~」と言うふうに、配列の要素のアドレスと言うのかどうか分かりませんが変更出来ないのでしょうか?。 どうぞ宜しく御願い致します。

    • ベストアンサー
    • Flash
  • 2次元配列の配列

    VisualBasic.NETでプログラムを作っているのですが、2次元配列の配列で行き詰って困っています。 配列1~3を別に定義して、その2次元配列を配列Xという配列にひとまとめにしたいのですが、エラーが出てしまいます。 エラー内容は「配列初期化子の次元が少なすぎます」で、場所は配列Xの第1要素です。 配列1~3以降もどんどん配列を追加していく予定なので、なるべく以下の方法で書いていきたいのですが、解決法はないでしょうか? また、他にいい方法があればご教授ください。 ソースです。 ---------------------------------------- Public 配列1(,) As Integer = _ { _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1} _ } Public 配列2(,) As Integer = _ { _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2} _ } Public 配列3(,) As Integer = _ { _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3} _ } Public 配列X(,)() As Integer = { _ 配列1, _     ←ここにエラーが出る 配列2, _ 配列3 _ } ---------------------------------------- 回答よろしくお願いします。

  • perlで配列のポインタをdllに渡すには?

    Active Perlの最新版(x86)を使っています。 C言語側で、 //配列の先頭要素へのポインタと配列の要素数を渡すと、要素の平均を整数で返す関数 int avr(int *array,int kazu) { int value=0; for(int i=0;i<kazu;i++) { value+=*(array+i); } return value/kazu; } などと書いて、avr.dllとしてビルドしたものを(モジュール定義はdefファイルにて指定)、 use Win32::API; my $function = Win32::API->new("avr", "avr", "PN", "N"); @array=(1,2,3,4,5); $avr=$function->Call(\@array,5); print "Content-type: text/html\n\n"; print $avr; と使ってみたのですが、出力値が期待の「3」ではなく、-123343252とか435893497などの無茶苦茶な数値になってしまいます。 配列のポインタの渡し方が違うのかとは思いますが、どう書いたら良いのか分からない状況です。 一応、他のプログラムからこのdllを使うと、正常動作するようです。

    • ベストアンサー
    • Perl
  • 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で配列のサイズを求める方法も知りたいです。

  • 配列 一部除外してソート?

    指定した要素を取り除いて再び配列を生成する方法で悩んでいます。 具体的には 1,2,3,4,5,6 という配列のとき、「3」を指定したときは 1,2,4,5,6 と配列し直してくれる関数などありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう