電子書籍の厳選無料作品が豊富!

例えば以下のように記載するとエラーとなります。
if($::FORM{'body'} =~ /パターン/){
push(@error, '投稿できません');
}

しかし、以下のように記載するときちんとパターンマッチします。
このふたつともエラーが出ておかしくないと思うのですが
なぜ以下ならOKなのか教えてください!!

@word=qw(パターン);

foreach (@word) {
if (index($::FORM{'body'},$_) >= 0) {
push(@error, '投稿できません。');
}
}

A 回答 (1件)

Shift_JIS使ってませんか?


もしそうなら、いわゆる「だめ文字」と呼ばれる問題です。
ーの2バイト目は [ です。「ー」と一文字に見えますが、Perl内部では2文字として処理されます。
そのため、メタ文字 [ に対する ] が無いのでエラーになります。
「ソ」「表」等の2バイト目が\なのは有名ですが、正規表現では、他にも注意しないといけない文字があります。
https://sites.google.com/site/fudist/Home/grep/s …
Perlで考えたら@もリストに使いますから、正規表現でなくても問題になりえます。

あと、これはPythonでの話しですが、Perlでも同じような現象が起こります。
http://oshiete.goo.ne.jp/qa/7630123.html

最近のPerlなら、
・ use utf8;してutf-8でスクリプトを記述
・入出力はencode/decodeでバイト列⇔utf8文字列の変換する。(またはPerlIOを使う)
のがいいと思います。

> if (index($::FORM{'body'},$_) >= 0) {
index関数は、文字列を単純に比較するだけです。
正規表現ではありません。なので [ が混っていても問題ありません。
    • good
    • 0
この回答へのお礼

大変丁寧な回答をいただき、また分かりやすくありがとうございます。
大変よく理解できました。

お礼日時:2012/08/12 08:54

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