とりあえず、レスの件数の取得の仕方です。
仕様を取り違えていたら、ごめんなさい。
================================================
#!/usr/bin/perl -w
#説明 BBSデータサブ件数を取得
#引数 $BbsIndex:BBSIndex
#戻値 BBSデータサブ件数
sub GetBbsDataSubCnt{
if (@_ < 1) {return 0;}
my ($BbsNo) = shift @_;
if ( $BbsNo =~ m/^¥d+¥D+(¥d+)$/ ) {return ($1 - 1);}
return 0;
}
#------------------------------------------------
# GetBbsDataSubCnt()のテスト
# $BbsIndex(引数)は、数字-数字となっている
#------------------------------------------------
print ”1-1 = ” . GetBbsDataSubCnt (’1-1’) . ”¥n”;
print ”1-2 = ” . GetBbsDataSubCnt (’12-21’) . ”¥n”;
print ”1-3 = ” . GetBbsDataSubCnt (’13-331’) . ”¥n”;
print ”*** = ” . GetBbsDataSubCnt () . ”¥n”;
=================================================
余計なお世話かもしれませんが、
最初の書き込みのときに「1-1」
とはぜずに「1=(レス件数)」
などとすると、ルートかレスかの違いもわかり
表示の際の速度も速いので
いいんじゃないかなぁと思います。
質問には答えていませんけど…
>最初の番号(例1-1,2-1...)にはレスがついていません。
あれ? 変でした??
先ほどのスクリプトの修正版(エラーの戻り値を99999に変更)と、その実行結果を載せますね。
=================================================
#!/usr/bin/perl -w
#説明 BBSデータサブ件数を取得
#引数 $BbsIndex:BBSIndex
#戻値 BBSデータサブ件数
sub GetBbsDataSubCnt{
if (@_ < 1) {return 99999;}
my ($BbsNo) = shift @_;
if ( $BbsNo =~ m/^¥d+¥D+(¥d+)$/ ) {return ($1 - 1);}
return 99999;
}
#---------------------------------------------------
# GetBbsDataSubCnt()のテスト
# $BbsIndexは、数字-数字となっている
print ”1-1 = ” . GetBbsDataSubCnt (’1-1’) . ”¥n”;
print ”1-2 = ” . GetBbsDataSubCnt (’1-2’) . ”¥n”;
print ”2-1 = ” . GetBbsDataSubCnt (’2-1’) . ”¥n”;
print ”2-2 = ” . GetBbsDataSubCnt (’2-2’) . ”¥n”;
print ”ABC = ” . GetBbsDataSubCnt (’ABC’) . ”¥n”;
print ”*** = ” . GetBbsDataSubCnt () . ”¥n”;
===================================================
実行結果
1-1 = 0
1-2 = 1
2-1 = 0
2-2 = 1
ABC = 99999
*** = 99999
===================================================
これで間違ってますか?
あと、お望みの条件判断ですが、2つめの数字が1以外なら、レスがあると判断して良いのでは?
と、ここまで書いて気がつきました!!
あるレス番号を元に、全ての記事にレスが無いことを確認したいのでしょうか?
だとしたら、記事を管理しているハッシュなり配列が分からないとスクリプトが書けないような。。。
前後の文脈から、@idListに各記事別のレス数が格納されているのでしょうか。
でしたら、@idListへのレス数の書き込みには(その記事の一番大きな$BbsIndexを引数にして)上記の関数を使用するとして、ある$BbsIndexの所属する記事のレス総数は下記のスクリプトで求められます。
===================================================
#記事別レス件数の配列。初期値はテキトー
@idList = ( 5 , 0 , 2 , 6 , 3 );
sub GetBbsDataSubCntAll {
if (@_ < 1) {return 99999;}
my ($BbsNo) = shift @_;
my ($topic_no , $res_no);
if ( $BbsNo =~ m/^(¥d+)¥D+(¥d+)$/ ) {
$topic_no = $1;
$res_no = $2;
return $idList[$topic_no - 1];
}
return 99999;
}
===================================================
@idListに各記事別のレス数を格納する方法は、記事やスレッドの構造(どんなハッシュ/配列に何が入っているか)を明示しないと、誰も答えようがないと思います。(^^;
では、私は回答権を使い果たしましたので、これで失礼します。
苦労も多いと思いますが、成功すれば喜びもヒトシオでしょう。頑張ってください。
有難うございます。
記事の構造は、$BBSItem_ID,$BBSItem_Subject,
$BBSItem_Message,$BBSItem_Date,$BBSIndex,$BBSSubIndexです。
自分もPerl初心者なのでわからないところがあります。すみません(^^;
http://www.hatena.ne.jp/1058265317
会員専用の掲示板を制作しているのですが、掲示板に書きこみがうまくいかないです。ソースを見ていただきたいのですが、長いので質問枠に書けないのです。何処が原因になり.. - 人力検索はてな
すみません。
正直に言いまして、いままで質問の意図がわかりませんでした。
この件は、上記URLの続きだったんですね。
(質問にその旨を書いておけていただければ、もっと適切な回答が得られたと思いますよ)
とすると、@idListという配列に、(’1-1’, ’1-2’, ... , ’999-99’)等というレス番号が(全ての記事の分)格納されているわけですね。
ですが、質問の意図だけが、まだ分かりません。
あるレス番号($BbsSubIndex)の記事(’topic-res’のtopic)に一つでもレスがついているとき、
(1) その記事(’topic’)を部分削除。
(2) 全ての記事(@idListにある全て)を部分削除。
(3) その他(条件を詳しく教えて下さい)
・・・どれでしょう?
まあ、(1)にしろ(2)にしろ、@idListはハッシュ(%idList)にしておけば、随分楽ができるような気はします。
それはともかく、判る範囲で回答に移りたいと思います。
まず、(1)の場合ですが、記事別のレス件数を返すスクリプトは以下の通りです。
(sasadaさんのスクリプトを流用しました。ご容赦ください。m(_ _)m )
##########################################
#!/usr/bin/perl
#説明 BBSデータサブ件数を取得(同一記事内のレス数を取得)
#引数 $BbsIndex:BBSIndex
#戻値 BBSデータサブ件数
#広域変数 @idListを使用
sub GetBbsDataSubCnt{
#件数所得でなく、レスの有無だけでよければ、ここでreturn false;
if (@_ < 1) {return 99999;}
my ($BbsNo) = shift @_;
my ($bbsIdx_topic , $bbsIdx_resno);
my ($idList_topic , $idList_resno);
if ( $BbsNo =~ m/^(¥d+)¥D+(¥d+)$/ ) {
$bbsIdx_topic = $1;
$bbsIdx_resno = $2;
} else {
#レスの有無だけでよければ、ここでreturn false;
return 99999;
}
my ($res_cnt) = 0;
for (@idList) {
if ( $_ =~ m/^(¥d+)¥D+(¥d+)$/ ) {
$idList_topic = $1;
$idList_resno = $2;
if ( $idList_resno == 1 ) { next; };
} else {
next;
}
if ($idList_topic < $bbsIdx_topic) { next; }
if ($idList_topic > $bbsIdx_topic) { next; }
#レスの有無だけでよければ、ここでreturn true;
++$res_cnt
}
#レスの有無だけでよければ、ここでreturn false;
return $res_cnt;
}
#----- TEST -----
@idList = ( ’1-1’, ’1-2’, ’1-3’, ’2-1’, ’2-3’, ’11-1’ );
print ” 1-1 = ” . GetBbsDataSubCnt (’1-1’) . ”¥n”;
print ” 1-2 = ” . GetBbsDataSubCnt (’1-2’) . ”¥n”;
print ” 2-1 = ” . GetBbsDataSubCnt (’2-1’) . ”¥n”;
print ” 2-2 = ” . GetBbsDataSubCnt (’2-2’) . ”¥n”;
print ”11-1 = ” . GetBbsDataSubCnt (’11-1’) . ”¥n”;
print ” ABC = ” . GetBbsDataSubCnt (’ABC’) . ”¥n”;
print ” *** = ” . GetBbsDataSubCnt () . ”¥n”;
##########################################
出力結果:
1-1 = 2
1-2 = 2
2-1 = 1
2-2 = 1
11-1 = 0
ABC = 99999
*** = 99999
##########################################
こんな感じです。
でも、この関数GetBbsDataSubCntを呼ぶ前に、$BbsSubIndexをチェックして レス番号が1でなかったら、即決で部分削除処理行きでしょう。(^^;
これは、(2)の場合でも同様です。
また、部分削除/全体削除を判断するだけなら、レスの有無だけチェックすれば十分です。件数までは要らないと思います。
次に(2)のスクリプトですが、これは(1)のスクリプトから
if ($idList_topic < $bbsIdx_topic) { next; }
if ($idList_topic > $bbsIdx_topic) { next; }
を削除すれば、とりあえず動きます。(ムダが多いですけど)
これで答えになりましたでしょうか?
有難うございます。
言い間違えているみたいです。レスのつき方は、
一番目の記事の場合、1-1,1-2,1-3..ってついていきます。2番目は2-1,2-2,2-3ようになります。最初の番号(例1-1,2-1...)にはレスがついていません。