チャットのログにある特定の文字にリンクを貼りたいと思っています。

たとえば『マイクロソフト』『アップルコンピュータ』『IBM』というキーワードを前もってデータファイルにURLと共に登録しておいて、ログにそれらのキーワードが出てきたらそれらのサイトへのリンクタグをつけます。

で、以下のようなプログラムで置換を行うと決まって『ー』という文字の含まれるキーワード(たとえばアップルコンピュータ)を置換するときにエラーになります。

\のエスケープ文字をつければいいと言うものでもなく、正規表現の問題というだけでどうすればいいのか全く分かりません。また、他の文字でも起こり得ることなのかも分かっていません。アドバイスよろしくお願いします。

Apacheのエラーログ
[Tue Oct 23 16:16:54 2001] [error] [client 127.0.0.1] Unmatched [ before HERE mark in regex m/アップルコンピュー << HERE タ/ at d:\PROGRA~1\APACHE~1\APACHE\CGI-BIN\CHAT\CHATPOST.CGI line 216.

***置換部分の一行***

$CHAT{Message} =~ s/$FILE{Keyword}/$FILE{Keyword}\<a href="http:\/\/$FILE{Link}" target="_blank"><font size=1>*<\/font><\/a>/g;

このQ&Aに関連する最新のQ&A

A 回答 (2件)

sjis -> euc -> sjis としているわけですね。


確かに大丈夫だとは思います。

wind 系で apache を使用していらっしゃるようですが、エディタで編集するのが便利ということであれば、「秀丸」などのエディタであれば、sjis, euc などを扱えるので特に困ることもないかと。

「便利」というだけで、sjis -> euc -> sjis とすることもないかな?というのが私の考えですが、いかがでしょう。

もし、sjis ということであれば、JPerl を使用したほうがよいのではないでしょうか。
5.005_03 ベースでよいのであれば、バイナリも存在しますし。
私は Unix 系ですが、JPerl を使用して不具合無くサイトを構築した経験もありますし。ただ、jcode.pl の挙動が怪しいという話は聞いたことがあります。

# 最近 perl はご無沙汰なのですが、5.6 からマルチバイト対応になったと
# 聞いています。
# ただ、どの程度対応なのかは確認していませんが。。。
    • good
    • 0
この回答へのお礼

いろいろありがとうございました。

http://homepage1.nifty.com/nomenclator/perl/shif …
を見たところShift_JISは多くの問題を抱えていることが分かりました。
私の知っていた問題点はその一部に過ぎなかったようです。

ほかのスクリプトのデータがかなり膨大なので、
いまさらデータをEUCへ変換することができません。
(サイトはレンタルサーバーを利用していてそこはActivePerlを使って
いるのでJPerlに変更できません。不具合はローカルで実験した時に発生したものです。)

その場しのぎの策でなんとかしたいと思います。
本当にありがとうございました。

お礼日時:2001/10/24 13:14

ひょっとして、データを Sjift_JIS で記述していませんか?


ならば、「ー」だけでなく「表」などもアウトだと思うのですが。(いわゆる、二バイト目があたるという問題です。)

JPerl など、日本語対応の perl 以外なら、EUC で保存するほうがよいかもしれません。

文字化けが心配なら、

Content-type: text/html; charset=EUC-JP

とすれば、「まず」文字化けはしないと思います。

この回答への補足

ありがとうございます。
たしかにShift_JISでデータに記入しています。
たしかに下のような対策を講じるとエラーは起きなくなりました。


Shift_JISだとエディタで編集するのに便利だったので、
他のスクリプトの全てのデータがShift_JISで保存しています。
Shift_JISだとパターンマッチは不可能ということなのでしょうか?
今のところ下の対策で凌いでいますが、
もし対策があれば教えてください。よろしくお願いいたします。

&jcode::sjis2euc(\$FILE{Keyword});
&jcode::sjis2euc(\$CHAT{Message});
$CHAT{Message} =~ s/$FILE{Keyword}/$FILE{Keyword}<a href="http:\/\/$FILE{Link}">*<\/a>/g;
&jcode::euc2sjis(\$CHAT{Message});

補足日時:2001/10/23 23:33
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Q$in{'~'}を$~に変換

CGIを改造中です。
変数の処理なのですが、サブルーチン内で利用するときに「$in{'~'}」と言う形でしか表示してくれません。これを「$~」の形にしたいです。
数が少なければ「$~ = $in{'~'}」を個数書けばいいのでしょうけど、結構数があるので、何か簡単な方法で変換できないかと考えています。
良い方法があれば教えてください。

Aベストアンサー

ハッシュのままで何か不都合があるのかなと
疑問に思いつつ・・・
#実際ハッシュは
#「(変数の)値に別の値を対応させる」
#ために存在するわけだから

けど,まあ,やろうと思えばkeys関数でできますよ.

%in=(
'X' => 1,
'Y' => 2,
'Z' => 3,
);

for $key (keys %in){
${$key}=$in{"$key"};
print "key; $key ${$key}\n";
}

print "$X $Y $Z";

strictとwarningsのプラグマを外さないといけないので
副作用の方が大きいでしょうが.

Q変数 $abc と ${abc}

$abcを
${abc}と書くのはなぜですか
よろしくお願いします。

Aベストアンサー

正確なところは知らないのですが、
{}で囲むと変数名を明確にすることができます。
$abc = "123";
の時、$abc . "456"のつもりで
print "$abc456";
とすると、変数abc456の内容が出力されます。
一方、print "${abc}456";
とすると、上手く行きます。

Q@{$protocol_name}

usr strict;
をつかって、

$protocol_name = "pppoe";

@{$protocol_name}

のような使い方をしたいと思っていますが、

Can't use string ("pppoe") as an ARRAY ref while "strict refs" in use at ./ctest.pl line 152, <RCFG2> line 7

のようにエラー表示がでてしまいます。
どうしたら回避できるでしょうか。

Aベストアンサー

@pppoe という配列を生成する段階でハッシュ等扱いやすい変数に格納しておくのが定石だと思います。

・ハッシュにハードリファレンスで格納する方法
$protocol{pppoe} = \@pppoe; # 代入
@{$protocol{$protocol_name}} # 参照
# @pppoeとしましたがもちろん無名配列でかまいません。

・分岐させる方法
if($protocol_name eq "pppoe"){
... = @pppoe;
}elsif ...

・シンボリックリファレンスだけ許可させる方法
no strict 'refs';

・%main::から引く方法
@{$main::{$protocol_name}}


このカテゴリの人気Q&Aランキング

おすすめ情報