間違った正規表現の場合にエラーを出すには?
[上に]
[前に]
[次に]
ひだか
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
納得。
[上に]
[前に]
[次に]