人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

掲示板の投稿者の削除機能で、レスの件数が0件なら一括削除。レスが一件でもあれば部分削除にしたいのです。$BbsSubIndexがレスの番号です。最初は1-1、レスがつくと1-2,1-3・・・といったかたちになります。恐らくレスの件数を取得しないといけないと思うので、下記のサブルーチンを使う、使わないに関係なくレスの件数の取得の仕方を教えて頂けないでしょうか?それで、それを使って最初に書いた条件の処理文も教えて頂けないでしょうか?宜しくお願いいたします。#説明 BBSデータサブ件数を取得#引数 $BbsIndex:BBSIndex#戻値 BBSデータサブ件数sub GetBbsDataSubCnt{ my ($BbsNo) = @_; return int(@{$idList[$BbsNo]}); }

●質問者: miller31
●カテゴリ:ウェブ制作
✍キーワード:BBS sub サブルーチン データ レス
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● sasada
●25ポイント

とりあえず、レスの件数の取得の仕方です。

仕様を取り違えていたら、ごめんなさい。

================================================

#!/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-2,1-3..ってついていきます。2番目は2-1,2-2,2-3ようになります。最初の番号(例1-1,2-1...)にはレスがついていません。


2 ● mady
●25ポイント

余計なお世話かもしれませんが、

最初の書き込みのときに「1-1」

とはぜずに「1=(レス件数)」

などとすると、ルートかレスかの違いもわかり

表示の際の速度も速いので

いいんじゃないかなぁと思います。

質問には答えていませんけど…


3 ● sasada
●25ポイント

>最初の番号(例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初心者なのでわからないところがあります。すみません(^^;


4 ● namwonS
●25ポイント

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; }

を削除すれば、とりあえず動きます。(ムダが多いですけど)

これで答えになりましたでしょうか?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ