WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:spliceと繰り返しについて

0:[投稿] Leo [2004/11/24 01:06 ][環境:XPpro AN HTTPD]

こんばんは、未熟者ですが宜しくお願いします。

配列の特定の行を削除したく、
for( $ct = $length; $ct > 0; $ct-- ){
 $delete = splice @res,@checkbox[$ct],1;
}
というように書いているのですが、
$deleteに、@resの@checkbox[$ct]番目の要素が削除されません。
ですが、これをfor文の外に書くと思ったとおりに動いてくれます。

原因がわからないのですが思ったとおりにするにはどうしたらいいのでしょうか?
宜しくお願いします。


1:[回答] Leo [2004/11/24 03:48 ]

>$deleteに、@resの@checkbox[$ct]番目の要素が削除されません。
削除されませんではなくて、$deleteに挿入されません。でした^^;
あと@checkbox[$ct]は$checkbox[$ct]にしたほうが正しいのでしょうか?

それと追加質問なのですが、実はこれ、
ログファイルを一旦全て@resに入れて、それからチェックボックスで指定された要素を削除して、それをまたログファイルに上書きするといったやり方をしています。
これだとログファイルのデータ量が多い場合とても効率が悪いと思うのですが、何かいいやりかたはないでしょうか?

重ね重ね宜しくお願いします。


2:[回答] gun [2004/11/24 15:58 ]

パールの場合、デフォルトでは配列の開始番号は 0です。
配列の開始番号を変更しているわけでないとすると、
Leoさんが提示されているfor文だと、0番目が対象外に
なってしまいます。
($length ~ 1に対してしか処理していない)

>for( $ct = $length; $ct > 0; $ct-- ){


3:[回答] Leo [2004/11/24 22:26 ]

gunさん、返答ありがとうございます。

これは実は、ログファイルを
@res = <FILE>;
で取り込んだ時に、なぜか一番最後の行が0番目に入ってしまいまして…。でもその行は、@resの最後の要素にもしっかりと入っているので、それの対処でした。これも原因が分らないのですが^^;

書き忘れたことで申し訳ないのですが、
for文の外に
$delete = splice @res,0,1;
こう書いた場合と、for文の中に書いた場合とで結果が変わってしまうのです。
下記がそのソースになります。

open( FILE, "+<$file3")  || die "指定されたログファイルが見つかりません\n";
@res = <FILE>;
close( FILE);

$length = @res;     # 配列の要素数
$ct = 0;
$delete = splice @res,$checkbox[$ct],1;

for( $ct = $length; $ct > 0; $ct-- ){
#  $delete = splice @res,@checkbox[$ct],1;
}
print "<BR>削除対象=$delete</font>\n";

教えてばかりで申し訳ないのですが、宜しくお願いします。


4:[回答] miz [2004/11/24 22:56 ]

>>3
>$length = @res;     # 配列の要素数

たぶん、@resの方が、@checkbox よりずっと大きい配列だと思いますので、完全に配列添え字over errorですね。
perlだから、未定義値扱い=0で済んでるのかもしれませんが。
で、@resの行数全部削除になってるのでしょう。。。。
でも、他の言語だと最悪OSごと落ちますよ。

$length = $#checkbox;  ### =scalar(@checkbox)-1 ○
$length = @checkbox;   ### ×配列添え字over


@checkboxは、昇順データであることは、保証されているのでしょうか?
降順ソートしないと、削除されるたびに、順番が狂ってしまいますよ?
foreach $ct (sort {$b <=> $a} @checkbox){
 $delete = splice @res,$checkbox[$ct],1;
}


5:[完了] Leo [2004/11/25 00:41 ]

mizさん、ありがとうございます〜。
できました!ありがとうございます!

>でも、他の言語だと最悪OSごと落ちますよ。
なんかとんでもない書き方をしていたようですね^^;
遊びでcgiを作っているレベルで、
最近時間が出来たのでなんとなくサイトでも作ってみようか
くらいな勢いで作り始めたので全然理解できていませんでした。

レス頂いたお二方、助かりました!
どうもありがとうございました。


6:[完了] miz [2004/11/25 21:27 ]

完了しているのに、続けて済みません。
foreach文の内部変数をうっかり間違えてしまいした。
そのままでは恥ずかしいので訂正させて下さい。
>>4
訂正後
foreach $ct (sort {$b <=> $a} @checkbox){
 $delete = splice @res,$ct,1;
}

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World