[過去ログ] bbs.cgi再開発プロジェクト6 (1001レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
477
(1): 動け動けウゴウゴ2ちゃんねる 2005/06/07(火)17:39 ID:LLOWUNeo0(1) AAS
>>476
正規表現の所でえらー

アルファベットだけの所で巻き添えも出やすくなりそう
478: 動け動けウゴウゴ2ちゃんねる 2005/06/07(火)22:47 ID:fi6yLSjv0(1) AAS
> 正規表現の段階なら
> Shift_JIS文字列だけquotemetaすれば良いし、
479: 476 2005/06/08(水)12:25 ID:DTGWGuO70(1/3) AAS
>>477
NGワード内って正規表現交じりですか?そうでないならばっさりquotemetaすれば良いし、
Shift_JIS部分だけquotemetaするコードくらいなら書きますよ。

あと、済んだことだけど、

# 読み込む。。。 
# my @Rock_word = @FOX_Ro54; # メモリの無駄なので省略してみました。 

こういう場合は参照使えばメモリ食わないんではないかと。
性能には一切貢献しないと思うけど、

my $In_Strings = $GB->{FORM}->{'MESSAGE'}; # 長いので代入 
省9
480
(3): 476 2005/06/08(水)15:50 ID:DTGWGuO70(2/3) AAS
> Shift_JIS部分だけquotemetaするコードくらいなら書きますよ。

とか言うほどの事じゃなかった。むしろテストの方が大変だった。
必要な作業だったのかどうか謎だけど一応上げておきます。
perl5.00503でテスト。

(票表十){2}

とか問題ありそうなShift_JIS + 正規表現交じりでやってみたけどOKでした。

foreach my $NG_word_ref (@FOX_Ro54){
  my $NG_word = $NG_word_ref->[0]; # エスケープしたままじゃ他で使えないのでコピー
    next unless $NG_word; # 空文字列ならスキップ
  $NG_word =~ s/((?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])+)/quotemeta($1)/geo;
省12
481
(1): ◆TWARamEjuA 2005/06/08(水)16:30 ID:pgAoBpPW0(1) BE AAS
リストは、正規表現文字列が連なっております。
例えば。
(\.|.|/|/)(3|3|4|4|6|6|8|8|9|9 ...長いので省略。
↓Shift_JISですと、こうなります。
Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE .|.|/|/)(3|3|4|4|6|6|8|8|9|9 ...長いので省略。
/が、バけていますよね♪([/] = 0x815E)

→こういう場合は参照使えばメモリ食わないんではないかと。
それ以前に、IsKoukokuでしか利用されていませんので、そのまま利用しました。
リファレンスにしろグローバルを触っちゃいますし。

→こうして$$In_Stringsで使った方が若干メモリ(と文字列コピーにかかるコスト)はお徳。
省4
482: 動け動けウゴウゴ2ちゃんねる 2005/06/08(水)19:06 ID:DTGWGuO70(3/3) AAS
>>481
その文字列でチェックしてみたんですが、
5.00503ではエラー起きませんね。省略部分に何かあるんではないでしょうか?

> (\.|.|/|/)(3|3|4|4|6|6|8|8|9|9

これの8ビット目が立ってるバイトを「#」に置き換えると↓こんな感じです。

(.|#D|/|#^)(3|#R|4|#S|6|#U|8|#W|9|#X

「^」は一応メタキャラですが文頭にないので素通りのようです。最後、括弧が閉じてないので
勝手に閉じ括弧付けて実験しました。
省3
483
(2): 476 2005/06/09(木)12:03 ID:NnR04xax0(1/2) AAS
evalってコスト高いんじゃ……?と思ったのでベンチ取ってみた。
@FOX_Ro54が2048個のチェックを1000回。

Benchmark: timing 1000 iterations of with_eval, with_noeval...
 with_eval: 159 wallclock secs (158.80 usr +  0.02 sys = 158.82 CPU) @  6.30/s (n=1000)
with_noeval: 155 wallclock secs (154.28 usr +  0.05 sys = 154.33 CPU) @  6.48/s (n=1000)

誤差の範囲内なので、運用上の安全を考えると現状維持で良いと思った。>>480のコードのベンチも取ってみた。
ついでにJcode.pmで双方ともEUCに変換した時の結果も。

Benchmark: timing 1000 iterations of with_jcode, with_noreg, with_reg...
with_jcode: 493 wallclock secs (490.95 usr +  0.07 sys = 491.02 CPU) @  2.04/s (n=1000)
with_noreg: 124 wallclock secs (123.99 usr +  0.04 sys = 124.03 CPU) @  8.06/s (n=1000)
省4
484
(1): ◆TWARamEjuA 2005/06/09(木)15:31 ID:vy/zxLpj0(1) BE AAS
>>483
エロエロとありがとうですm(_ _)m深謝
ただ、、、今、家にあるメインの林檎機が昇天されましたので、対応が出来ないで居ますですぅぅぅ(滂沱)
♪実はすべての作業を林檎機でやっているものでして・・・
485
(1): 動け動けウゴウゴ2ちゃんねる 2005/06/09(木)18:20 ID:b8qRY6Z90(1/3) AAS
quotemetaを使わずに
s/(?<=[\x81-\x9F\xE0-\xFC])[\[\\\]\^\{\|\}]/\\$&/g
とかでも(やってることはあんまり違わないか)
486
(1): 476 2005/06/09(木)20:08 ID:NnR04xax0(2/2) AAS
>>485
それだとエラーが出ますね。例えば、

"ワ[a]"

だと「ワ」は2バイト目も8bitが立っているので検索がスキップされますよね。
で、2バイト目と3バイト目の組み合わせをShift_JISの「充」と間違えて開き角括弧
「 [ 」をエスケープしてしまいます。
487: 動け動けウゴウゴ2ちゃんねる 2005/06/09(木)20:50 ID:b8qRY6Z90(2/3) AAS
>>486
おお、そうだ。
488
(1): 動け動けウゴウゴ2ちゃんねる 2005/06/09(木)23:45 ID:b8qRY6Z90(3/3) AAS
もしかしてこうすればいいのか?(未テスト)
s/([\x81-\x9F\xE0-\xFC])([\[\\\]\^\{\|\}\x81-\x9F\xE0-\xFC])/$1\\$2/g
489
(1): 476 2005/06/10(金)00:51 ID:C8+6ZCy40(1/3) AAS
>>488
30秒考えた限りでは問題なさそう。ただ、ベンチ取った結果、quotemetaとほとんど
コスト同じなんだよね。2、3回やってみたけど誤差前後1秒以内。

 with_reg1: 146 wallclock secs (144.33 usr +  0.05 sys = 144.38 CPU) @  6.93/s (n=1000)
 with_reg2: 145 wallclock secs (144.18 usr +  0.05 sys = 144.23 CPU) @  6.93/s (n=1000)

となるとquotemetaの方が安全かなとは思う(自分贔屓ですんません)。
490: 動け動けウゴウゴ2ちゃんねる 2005/06/10(金)01:11 ID:Mm/OM+6u0(1) AAS
>>489
はやさの問題ではなくて気分の問題だったり.
>quotemetaの方が安全かなとは思う
同意w
491: タソキ@妄想系統 1/10 ☆ ◆Ver7J..... 2005/06/10(金)08:39 ID:klkomdbB0(1) AAS
>>483ナイスゥ

中の人が呑み屋さんに繰り出しちゃわないようにまとめてみます。

Shift_JIS の場合、エスケープする必要あり。
エスケープしておくと、リストの編集がはげしくめんどい。

解決方法
 1、encodingプラグマでエンコードする
 2、Shift_JIS文字列だけquotemetaする (エンコードよりはコストが安いはず)
後者のほうが処理コストが安い。
492: 476 2005/06/10(金)11:20 ID:C8+6ZCy40(2/3) AAS
>>484
ご愁傷さまです。早い復活を祈ってます。

>>480
あと若干ソースを変更。空文字チェックは直前の方がより安全ってのと、evalの結果の代入は
必要ないかと。

foreach my $NG_word_ref (@FOX_Ro54){
  my $NG_word = $NG_word_ref->[0]; # エスケープしたままじゃ他で使えないのでコピー
  $NG_word =~ s/((?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])+)/quotemeta($1)/geo;
    next unless $NG_word; # 空文字列ならスキップ
  eval{$main::In_Strings =~ /$NG_word/} and return $NG_word_ref; # 合致したらリファレンスを返す。  
省2
493: 476 2005/06/10(金)11:23 ID:C8+6ZCy40(3/3) AAS
×   eval{$main::In_Strings =~ /$NG_word/} and return $NG_word_ref; # 合致したらリファレンスを返す。
○   eval{$In_Strings =~ /$NG_word/} and return $NG_word_ref; # 合致したらリファレンスを返す。

失礼。
494
(2): ◆TWARamEjuA 2005/06/10(金)17:24 ID:OGUiEi3G0(1) BE AAS
えっと、エスケープ処理は基地側で執り行おうと思っておりますので、IsKoukokuはそのままで桶になるかと♪
495: root▲ ★ 2005/06/11(土)00:49 ID:???0 BE AAS
>>494
りよかいです。
496: 476 2005/06/11(土)01:23 ID:VA/kMcZN0(1) AAS
>>494
お疲れ様です。とりあえず、

 next unless $NG_word; # 空文字列ならスキップ 

これはevalの直前に入れた方がいいと思うです。evalと同じくfail safeってことで。
極端な話、use strictしてないんだったら、quotemetaをtypoしただけで
NG_wordが全部空文字列(投稿が全部エラー)になるわけで。
1-
あと 505 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.105s*