• ベストアンサー

アスタリスクを検索できません

以下のテキストデータを、それぞれ*までの一行毎に配列に代入したいのですが、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. というメッセージが表示されます。 *関連で問題があるのはわかるのですが、どうしても解決策が見つかりません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

$pattern は index 関数の引数にもなっているので '*' のままとし、 if ($_ =~ /\Q$pattern/) または if ($_ =~ /[$pattern]/) のようにすれば、うまくいくように思います。

mtd15
質問者

お礼

\Qの追加によって製作中のものが思い通りに動きました。 ありがとうございます!

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

\Q~\E あるいは quotemeta という手もありますな.

mtd15
質問者

お礼

メタ文字の意味を打ち消すということなので、*等を検索したいときには何かと便利そうですね。 教えて頂いてありがとうございます。

  • sample_
  • ベストアンサー率76% (20/26)
回答No.1

>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 = '\*'; としてあげるとアスタリスクにマッチするようになります!

mtd15
質問者

お礼

量指定子についてのご丁寧な説明、ありがとうございます。 *以外のものにも注意の必要があるようなので、今後の参考にさせていただきたいと思います。

関連するQ&A