• ベストアンサー

pushをすると行ができる

下のような繰り返し文を作ったのですが、 unshiftのところをpushにするとなぜか 1行空いて保存されます。 unshiftだと大丈夫です。 書き込むときに 行があく理由と行があったら行を取るような 方法があったら教えてください。 改行を取る処理で行は削除されると思ったのですが。 foreach (@txt) { $data = $_; $data =~ s/\r//; $data =~ s/\n//; ($id, $tonum, $c_date, $c_status, $chkbox) = split(/,/, $data); if($tonum eq $mynum) { $html .= "<tr><td>$tonum</td><td>$c_date</td><td>$c_status</td><td>$chkbox</td></tr>"; if ( $rec_id < $id ) { $rec_id = $id; } $rec_id++; } } $newmsg = join(',', ($rec_id, $mynum, $date, $status,0)); unshift (@txt, $newmsg); ちなみに$rec_idは一行ごとに一意(ユニーク) のidをつけようとしているのですが、idのつけ方で 効率的な方法があったらご教授ください。

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

  • ベストアンサー
  • taseki
  • ベストアンサー率66% (155/233)
回答No.2

$data =~ s/\r//; $data =~ s/\n//; ↑これではg修飾子がないので「はじめに見つけた」\rまたは\nだけを削除、ということになりますが、確認してみては。 ちなみに、 http://okwave.jp/kotaeru.php3?q=2409024 からのスクリプトだとしたら、ファイルから読み込んだデータでしょうか。 その場合はchompで末尾の改行を削除できます。

参考URL:
http://okwave.jp/kotaeru.php3?q=2409024
noname#102619
質問者

お礼

いつも回答ありがとうございました。 >chompで末尾の改行を削除 という方法でいまのところ対応しています。 まだ、空行ができるファイルがないので真偽は不明なのですが・・・

その他の回答 (2)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

今1つ質問の意味が理解できないところがあるので、的外れの回答かもしれません。 コードを見る限り、@txt の元の要素の末尾には改行が付いていて、追加する $newmsg の末尾には改行はついていません。そのための、違いではないでしょうか。 例えば、@txt の内容が ("data1\n", "data2\n") となっていて、push または unshift で $newmsg を追加した場合、print "@txt\n" で表示すると以下のようになります。 1)push の場合: ("data1\n", "data2\n", $newmsg) data1 data2 $newmsg 2)unshift の場合: ($nwemsg, "data1\n", "data2\n") $newmsg data1 $data2

noname#102619
質問者

お礼

回答ありがとうございました。 改行ができる理由としては、どっかに余計な改行がついていることが考えられるわけですね。そこを見落としてました。まだ見つかってませんが、見つけたいと思います。

  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.1

unshiftは配列の先頭に要素を追加、 pushは配列の最後に要素を追加 の差で実際質問内にあるコードを動かして見ましたがそれ以外の差はありませんでした。 "1行空いて保存"というのが先頭に来ているか後ろに付いているかの差では? (つまり$rec_id, $mynum, $date, $statusのどれかに改行が含まれている?) idの付け方はどんな規則性があるのか不明なのでアドバイスは難しいです (コードからも読み取れませんでした)

noname#102619
質問者

お礼

回答ありがとうございました。 確かにおっしゃるとおりですね。どこか自分でおかしなことをしている気がしてきました。