[過去ログ] 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*