- ベストアンサー
アスタリスクを検索できません
以下のテキストデータを、それぞれ*までの一行毎に配列に代入したいのですが、if文で*を検索しようとしてもうまくできません。 あいうえお* かきくけこ* さしすせそ* たちつてと* あいうえお* さしすせそ* あいうえお* 以上のものが元のテキストデータで、「あいうえお」を配列の0番目の要素、「かきくけこ」を1番目の要素、「さしすせそ」を2番目の要素・・・というようにしたいです。 現在のプログラムは、 hash.pl use encoding 'shift-jis'; $pattern = '*'; @txt1 = (); while(<>){ if($_=~/$pattern/){ $in=index($_,$pattern); $temp=substr($_,0,$in); push @txt1,"$temp"; } } print @txt1; となっているのですが、これをコマンドプロンプト上で動かすと、 Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at hash.pl line 5, <> line 1. というメッセージが表示されます。 *関連で問題があるのはわかるのですが、どうしても解決策が見つかりません。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
$pattern は index 関数の引数にもなっているので '*' のままとし、 if ($_ =~ /\Q$pattern/) または if ($_ =~ /[$pattern]/) のようにすれば、うまくいくように思います。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
\Q~\E あるいは quotemeta という手もありますな.
お礼
メタ文字の意味を打ち消すということなので、*等を検索したいときには何かと便利そうですね。 教えて頂いてありがとうございます。
- sample_
- ベストアンサー率76% (20/26)
>Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at hash.pl line 5, <> line 1. まずは、エラーについてですが直訳してみると 「正規表現の中に量指定子が従うべきものがないですよ!」 って言ってますね。 では、量指定子とは何かという話ですが、種類と意味を下記に記しておきます。 ?・・・前にある文字または条件に対し0個または1個にマッチ *・・・前にある文字または条件に対し0個以上にマッチ +・・・前にある文字または条件に対し1個以上にマッチ {a,b}・・・前にある文字または条件に対しa個~b個続いた場合にマッチ と、言った感じです。 今回は、アスタリスクにマッチさせたいという話でしたが、 アスタリスクは、量指定子というPerl内での決まった役割がある為 量指定子として振る舞おうとしたが、前に文字または条件が無いため 何に対し0個以上マッチすればよいか指定してないのでエラーを吐いたわけです。 これらの量指定子を使う場合は、前になにかないといけないわけです。 さて、量指定子のように決まった役割をもったものに対し本来の記号の 意味として使いたい場合は、エスケープしてあげる必要があります。 エスケープするには、\(OSによっては→\のように表示)をつけてあげます。 よって、 $pattern = '*'; を $pattern = '\*'; としてあげるとアスタリスクにマッチするようになります!
お礼
量指定子についてのご丁寧な説明、ありがとうございます。 *以外のものにも注意の必要があるようなので、今後の参考にさせていただきたいと思います。
お礼
\Qの追加によって製作中のものが思い通りに動きました。 ありがとうございます!