Spliceを使った配列移動方法についての質問

このQ&Aのポイント
  • Spliceを使った配列移動方法について困っています。最後の配列を5列目に追加したいのですが、4列目に追加されてしまいます。
  • 質問文では、2番目の配列を新たに5列目に追加したいと述べていますが、実際には4列目に追加されてしまいます。
  • 対処法を教えていただけると助かります。
回答を見る
  • ベストアンサー

Spliceを使った配列移動

以前Spliceを使った配列の移動方法を教えていただきましたが、 open( FH, $file) or die "Can't open"; @list = <FH>; close(FH); push(@list,@list[$b-1]); #配列を最後列にコピー open (OUT,"> $file"); print OUT @list; close (OUT); とさせると、最後の配列を5列目に追加したいのですが4列目に追加されてしまい、困っています。 2番目の配列を新たに5列目にこうしたいのに 1コメントA コメントB 2あいうえお かきくけこ さしすせそ 3たちつてと なにぬねの はひふへほ 4らりるれろ まみむめも 5あいうえお かきくけこ さしすせそ 4列目の配列の後ろに追加されてしまう 1コメントA コメントB 2あいうえお かきくけこ さしすせそ 3たちつてと なにぬねの はひふへほ 4らりるれろ まみむめもあいうえお かきくけこ さしすせそ このようになってしまいます。 宜しければ対処法をお願いします。

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

色々?なところはありますが、それはおいといて その症状の原因は、おそらく 1行目[改行] 2行目[改行] 3行目[改行] 4行目 のようにファイルの最後のデータに改行が無いため、 そのような動作になると思います。 対処の単純な方法は、読み込むデータの最後にも改行を付けることですが、 読み込むデータの変更ができない場合は、 入力時にchomp で改行を取り除き 出力時に改行を付け加えることです。

crazy_jazz
質問者

お礼

テキストファイルの最後の行を改行するだけで解決できました。 出力時に\nを足せばそういうこともできるということですね。 どうもありがとうございました。

関連するQ&A

  • 配列の一部を書き換えてファイルに保存する方法は?

    $dicname ='GermJ.txt'; open(IN, "$dicname"); @list = <IN>; close(IN); 読み込んだ配列@listの5番目のデータを'aaaaaaaaaa'に書き換えたいのですが、 $list[5]='aaaaaaaaaaaaaaaaa'; open(OUT, "> $dicname"); foreach (@list) { print OUT $_; } close(OUT); とやって、ファイルの中身を調べると、6番目の文字列データが5番目の文字列データの後ろにくっついてしまっています。 改行マークを $list[5]='aaaaaaaaaaaaaaaaa',\n;のように行末に追加しても、次の行とのあいだに空間が生まれます。基本的なファイル書き込みの知識をお尋ねして申し訳ありませんが,どうかお教えください。

    • ベストアンサー
    • Perl
  • perlです。配列ファイルをよみこんで、1つの要素を上書きする方法

    配列のファイルがあり、それをよみこんで、1つの要素だけ上書きして保存する方法を教えてください。 ex. file.datを以下のようなファイルだとして・・・ あいうえを かきくけこ さしすせそ たちつてと file.datが、 さしすせそ となるようにしたいのです。(つまり、三番目の要素を取り出し、上書き保存するというもの) 以下のように書いてみましたがうまく動きません。 open()やclose()は一回使うだけでいいように、読み書き両用で開いてみました。 $_にはファイル名が入っています。 open(FILE,"+<$_"); @temp=<FILE>; $temp2=$temp[2]; print FILE $temp2; close(LOGFILE); +<を+>とすると、ファイルが空(何も無くなる)となります。 まず読み専用で開いて、ファイルを閉じた後。上書き用で開いたほうがいいのでしょうか??

    • ベストアンサー
    • CGI
  • [python] 関数から配列を戻すには?

    グローバル変数(配列)の値を変えたいと思います。 ------------- line = [] def tmp_read(self, *out_line): f = open('tmp.txt') lines2 = f.readlines() # 1行毎にファイル終端まで全て読む(改行文字も含まれる) f.close() # lines2: リスト。要素は1行の文字列データ for line in lines2: print line, print *out_line = lines2 return *out_line tmp_read(self, *line) print line     ← 配列Lineの内容を確認する ------------- この「line」には、文字列を含む配列を入れる予定です。 lines2で得られた値を、戻せば出来そうな気もしますが巧くいきません。 どのように修正すれば酔いか、教えて頂けませんか。

  • 文字列からアルファベットを抽出

    EXCEL2007を使用致しております。 下記のように不規則な文字列から英字(全角・半角)を抽出する方法をご教示願えましたら幸いです。かなり無理が有るでしょうか… どうぞ宜しくお願い致します。 かきくけこkakikukeko さしすせそsashisusesoたちつてと naninunenoなにぬねの 【はひふへほ】hahihuheho mamimumemo《まみむめも》 YAYUAOやゆよ 『らりるれろ』rarirureroわをん1230

  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

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

    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
  • 配列を用いた文字置換

    初投稿です。よろしくお願いいたします。 kana2phone_rule.txtにはア+aという情報が五十音で入っています。01.txt.chaには愛+アイという情報が入っています。 以下のプログラムは01.txt.chaのプラスの後の要素 (アイ)を音表記(ai)に変換するというものです。 しかし変換の作業が行われない(アイ)ままファイルを吐き出してしまいます。 文字コードはEUC、改行コードLFで試しても、Jperlを用いてShift-JIS、CR+LFで試してもだめでした。 どこに問題があるのでしょうか。 分かりましたらよろしくお願いいたします。 open(IN,"kana2phone_rule.txt"); $j = 0; while($b=<IN>){ chomp $b; @list = split(/\+/, "$b"); $kana[$j] = "$list[0]"; $yomi[$j] = "$list[1]"; $j++; } close(IN); open(IN, "01.txt.cha"); open(OUT, "> kekka.txt"); while($a=<IN>){ chomp $a; @list2 = split(/\+/, "$a"); for($i=0; $i<=258; $i++){ $list2[1] = ~s/$kana[$i]/$yomi[$i]/g; } print OUT "$a [$list2[0]] $list2[1]\n"; } close(IN); close(OUT);

    • ベストアンサー
    • Perl
  • エクセル セルをそれぞれ分ける方法

    一つのセルに、 4154あいうえお商事 4654かきくけこ建設 53123さしすせそ(株) 3234たちつてと有限会社 8746なにぬねの 6546はひふへほ商事 8674まみむめも電気 864やゆよ商事 554らりるれろ板金 と入力されているのを      ↓ 4154   あいうえお商事 4654   かきくけこ建設 53123   さしすせそ(株) 3234   たちつてと有限会社 8746   なにぬねの 6546   はひふへほ商事 8674   まみむめも電気 864   やゆよ商事 554   らりるれろ板金 二つのセルにそれぞれ分ける方法を教えてください。

  • ファイルから読み込んで配列へ

    PerlでCGIスクリプト(掲示板もどき)を作成しています。 配列の操作がうまくいかず、ご教授頂きたいと思います。 <やりたい事> 1.ブラウザ上のフォームからの入力を、カンマ区切りでテキストファイルに追記して保存。 2.そのテキストの一部を使ってHTMLで表を作る。 <実際の作業> 1.フォームからのデータはcgi-lib.plで連想配列として受け取り、unshiftでテキストファイルへ追記する。 &ReadParse; #フォームからデータを受け取る $o=$in{'name'}; $p=$in{'mail'}; $q=$in{'title'}; $r=$in{'comment'}; open(IN,"xxx.txt"); @tmp1=<IN>; close(IN); #1件1行として新規データを追加する unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n"); open(OUT,">xxx.txt"); print OUT @tmp1; close(OUT); 2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。 データを読み込む時点でつまづき、先に進めません。 <テキストファイルの例> 1行目:a,b,c,d 2行目:e,f,g,h 3行目:i,j,k,l 以下同様 <症状> print @tmp1;とすると、a~lの全てのデータが表示される。 $tmp1[0];とすると、(a)のみ表示される。 $tmp1[1];とすると、カンマ(,)が表示される。 $tmp1[2];とすると、(b)が表示される。 <質問> 一つの行(配列)に対して2回繰り返す処理(nameとtitle)と、行単位で繰り返す処理(1行目、2行目…)を合わせればいいのだろうと思っていますが、どうすればいいのかわかりません。 気分的には↓こんな感じです。 foreach { "行の処理" foreach { "列の処理" } } そもそも、区切り文字であるカンマが、配列に格納されている時点で失敗しているのかな?とも思っています。 宜しくお願いします。 なお、不足している情報がありましたら補足いたします。

    • ベストアンサー
    • Perl
  • 1列のみ重複しているデータを抽出&削除

    A列   B列 12345 あいうえお 67891 かきくけこ 12345 さしすせそ 67891 かきくけこ 23456 あいうえお 78912 たちつてと 34567 さしすせそ 89123 あいうえお 12345 あいうえお 78912 なにぬねの     ↓ A列   B列 12345 あいうえお 67891 かきくけこ 67891 かきくけこ 12345 あいうえお 上記のようにA列のみダブっているものを抽出し一つにしたいのですが やり方がわかりません。よろしくお願いします。

専門家に質問してみよう