電子書籍の厳選無料作品が豊富!

下のような繰り返し文を作ったのですが、
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のつけ方で
効率的な方法があったらご教授ください。

A 回答 (3件)

$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
    • good
    • 0
この回答へのお礼

いつも回答ありがとうございました。

>chompで末尾の改行を削除

という方法でいまのところ対応しています。
まだ、空行ができるファイルがないので真偽は不明なのですが・・・

お礼日時:2006/09/20 02:10

今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
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

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

お礼日時:2006/09/20 02:11

unshiftは配列の先頭に要素を追加、


pushは配列の最後に要素を追加
の差で実際質問内にあるコードを動かして見ましたがそれ以外の差はありませんでした。
"1行空いて保存"というのが先頭に来ているか後ろに付いているかの差では?
(つまり$rec_id, $mynum, $date, $statusのどれかに改行が含まれている?)

idの付け方はどんな規則性があるのか不明なのでアドバイスは難しいです
(コードからも読み取れませんでした)
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

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

お礼日時:2006/09/20 02:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!