正規表現、もしくは、連想配列の使い方、もしくは、単なる文法エラーだと思うのですが、どこが間違っているか教えてください。

[上に] [前に] [次に]
じぇい 1999/05/28(金) 23:17:33
掲示板にタグ自動閉じ機能を付けようと思っています。
<font ...> <a ...> <i> <b> <u> <s> <big> <small> のタグを許可しようと思っています。
<font ...> と <a ...> に関してはうまくいっています…と思います。
問題は <i> <b> <u> <s> <big> <small> なのですが、

$tag{"i"} = $tag{"b"} = $tag{"u"} = $tag{"s"} = $tag{"big"} = $tag{"small"} = 0;

$f_msg =~ s/&lt;(i|b|u|s|big|small)(\s.*?)?&gt;/'<'.&open_tag($1).'>'/ige;
$f_msg =~ s!&lt;/(i|b|u|s|big|small)(\s.*?)?&gt;!'</'.&close_tag($1).'>'!ige;

while (($name, $value) = each(%tag)) {
  if($value > 0){
  $f_msg .= "</$name>" * $value;
}

sub open_tag{
  my($buf) = $_[0];
  $tag{"$buf"}++;
  $buf;
}

sub close_tag{
  my($buf) = $_[0];
  $tag{"$buf"}--;
  $buf;
}

という処理を行っています。これを実行するとサーバーエラーになりました。
この処理を省くとうまくいくので問題はこの処理の中にあると思います。
正規表現、もしくは連想配列の使い方に問題があると思うのですが、どこが原因なのでしょうか?(きっとすごい基本的なことのような気がします。^^;)



じぇい 1999/05/28(金) 23:23:31
ああ、、、自己解決です。

while (($name, $value) = each(%tag)) {
  if($value > 0){
  $f_msg .= "</$name>" * $value;
}

if文の閉じ忘れをしていました。^^;

しかし、、これでもうまくいきません。。

<b>test

と入力して送信してみると、

test0

となります。
原因を教えてください。
ちなみにもっと効率的な方法があれば教えてください。


じぇい 1999/05/29(土) 00:36:21
なんか上の文章変ですね、、。^^;
自己解決していません。^^;
もう一度質問を書きなおします。

$tag{"i"} = $tag{"b"} = $tag{"u"} = $tag{"s"} = $tag{"big"} = $tag{"small"} = 0;

$f_msg =~ s/&lt;(i|b|u|s|big|small)(\s.*?)?&gt;/'<'.&open_tag($1).'>'/ige;
$f_msg =~ s!&lt;/(i|b|u|s|big|small)(\s.*?)?&gt;!'</'.&close_tag($1).'>'!ige;

while (($name, $value) = each(%tag)) {
  if($value > 0){
  $f_msg .= "</$name>" * $value;
  }
}

sub open_tag{
  my($buf) = $_[0];
  $tag{"$buf"}++;
  $buf;
}

sub close_tag{
  my($buf) = $_[0];
  $tag{"$buf"}--;
  $buf;
}

このような処理をして、テストを行いました。

フォームのメッセージを記入するところに、

<b>test

と入力して送信したところ、

test0

と表示されていました。(一応タグの自動閉じは成功していました。)
上記の処理の間違いを教えてください。


じぇい 1999/05/29(土) 00:45:57
すいません。
ソースを見たところ、どうやら自動閉じは成功していませんでした。

<b>test

と入力したところ、

<b>test0

となっていました。

じぇい 1999/05/29(土) 00:53:00
[[解決]]
自己解決です。^^;


  $f_msg .= "</$name>" * $value;

こんな表現は存在しなかったんですね。^^;

  $f_msg .= "</$name>" x $value;

これでうまくいきました。
もし、もっと効率的な方法があれば教えてください。

B-Cus 1999/05/29(土) 07:15:21
> if文の閉じ忘れをしていました。^^;
ローカルにperlがあれば、文法エラーくらいわかるはず。
計算機でできることを、わざわざ人に聞くのはねぇ。

> じぇい 1999/05/28(金) 23:17:33
> じぇい 1999/05/28(金) 23:23:31
> じぇい 1999/05/29(土) 00:36:21
> じぇい 1999/05/29(土) 00:45:57
> じぇい 1999/05/29(土) 00:53:00
最近は、プログラミングに行き詰まったら数日間悩んでみる
という方法はすたれてしまったのでしょうか B)

じぇい 1999/05/30(日) 00:18:35
すいませんでした。人に頼りすぎていました。
あとで、こういうことは自分で解決すべきだと反省しました。
以後気をつけます。

それで、、
>ローカルにperlがあれば、文法エラーくらいわかるはず。
>計算機でできることを、わざわざ人に聞くのはねぇ。

というのはどういうことですか?
なにせ、、パソコンをはじめて触ったのもほんの2,3ヶ月前なので、基本的なことからあまりわかっていません。
よろしければ教えてください。

羽崎 1999/05/30(日) 01:20:19
PerlはなにもUNIX版しかない訳ではありません。
Windows版(Perl,Jperlなど)、Mac版(MacPerl)があります。
Perlスクリプトの文法チェックなどは、それらを自分のマシンに
インストールして、試しましょう。貴重なサーバマシンの資源やデータの転送経路をみんなで有効に使うためにローカル(自分のマシンやLAN上のマシンなど)でできることはなるべくローカルでやりましょう。
・・・というようなことは覚えておいたほうがいいマナーです。(多分^^;)
Perl初心者Perl初心者の部屋
http://www.att.or.jp/perl/index.html

もし必要であればローカルマシンにサーバ(Webサーバなど)
を入れることも可能です。CGIもサーバに設定すれば使用可能です。
Winでwebサーバ
http://www.st.rim.or.jp/~nakata/
Macでwebサーバ
http://mtlab.ecn.fpu.ac.jp/techAlley.html

>なにせ、、パソコンをはじめて触ったのもほんの2,3ヶ月前なの
>で、基本的なことからあまりわかっていません
ネチケットも含めて叱られながらこれからいろいろ学んでいきましょう。:)

じぇい 1999/05/30(日) 01:29:01
どうもありがとうございました。
早速インストールしてきます。

[上に] [前に] [次に]