間違った正規表現の場合にエラーを出すには?

[上に] [前に] [次に]
ひだか 1999/10/11(月) 16:50:05
$form{'com'}の値が間違った正規表現
( "/(/" や "///" など )の場合に
エラーを出すことは可能でしょうか。
色々試してみたのですがうまくいかず困っています。
どうかよろしくお願いします。

B-Cus 1999/10/11(月) 17:06:35
eval したまへ。さすれば神が $@ を授けてくれるであろう。

ひだか 1999/10/11(月) 18:40:15
ありがとうございました。
うまくいったかと思ったのですが、
/(/等の場合はエラーが出るのですが
///の場合はエラーが出ません。
どうしてでしょうか。
よろしくお願いします。

B-Cus 1999/10/11(月) 19:42:34
 % perl -e 'eval "/////"'
でエラーにならないってこと?
# クイズしてるんじゃないんだから、「どう書いたらエラーにならない」か
# くらい言ってね。

なんで ///// でエラーにならないかはわからないけど、/ は正規表現では
特別な意味は持ってなくて、ただ perl で「正規表現は // で囲む」という
規則があるだけなんだから、
 $regexp =~ s|/|\\/|g;
 eval "m/$regexp/" || die "$@";
ってな感じじゃない?
 $regexp =~ s|@|\\@|g;
 eval "m\@$regexp\@" || die "$@";
でもいいし。@ じゃなくて ! でも a でも b でもいけるかな。

ひだか 1999/10/11(月) 20:45:47
すみませんでした。
フォームに正規表現を書いてもらって(正規表現を囲む/を含む)
間違った正規表現ならエラーを出したいのです。
例えばフォームの内容が"/a//i"でも

/を区切りにして修飾子などをそれぞれ変数に入れたりする処理...
eval' $b =~ /(?$2)$1/; ';
if ($@) { &error; }

のように変数の値に/が入っていても正規表現を囲んでいる/と
区別できるのでエラーにならないということだと思うのですが、
/a\//iはエラーにせず/a//iのような場合だけ
エラーにすることはできないでしょうか。
何度もすみません。

B-Cus 1999/10/11(月) 23:29:54
うーん、言ってる意味がわかるようでわからないです。
 $form = '/a//i'
だとしたら、
 ($regexp,$option) = $form =~ m|^/(.*)/([imsxg]*)$|;
として、
 eval '$b =~ /(?$option)$regexp/'
としたい?

# 単純に
#  eval '$b =~ /$regexp/$option'
# とするのはダメなんですか?

で、
 $form = '/a\//i'
ならそのまま処理して、
 $form = '/a//i'
ならエラーにしたいということですか?

B-Cus 1999/10/11(月) 23:49:57
ところで、なんで perl -e '/////' とか perl -e '////////' はエラーに
ならないんですかね?

ひだか 1999/10/12(火) 16:02:40
>で、
> $form = '/a\//i'
>ならそのまま処理して、
> $form = '/a//i'
>ならエラーにしたいということですか?

はい、そうです。

B-Cus 1999/10/12(火) 18:47:40
じゃあ普通に eva ればいいと思うんですが。
 &myeval('/a\//i');
 &myeval('/a//i');

 sub myeval {
  eval $_[0];
  print "$_[0] $@\n";
 }
実行結果:
 /a\//i
 /a//i Illegal division by zero at (eval 2) line 1.

mm 1999/10/12(火) 18:54:13
>ところで、なんで perl -e '/////' とか perl -e '////////' はエラーに
>ならないんですかね?
あっ、ほんと、5個とか8個の場合にエラーになりませんね。
ということは、//は1を返す、/は除算演算子、ということでは…?

ひだか 1999/10/12(火) 21:47:11
[[解決]]
解決しました。ありがとうございました。
どうやら\の扱いで失敗していたようです。

B-Cus 1999/10/12(火) 23:21:20
なるほど。除算していたのですか。
 % perl -e 'print //////2'
 0.5
 % perl -e '////x/'
 Illegal division by zero
納得。

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