- ベストアンサー
置換した文字列を変数に代入する方法
お世話になります。 たとえば、 #!C:\Perl\bin\perl print $form->header("text/html"); : open(IN,"<file.txt"); while(<IN>){ : : s/あい(.*?)うえお/$1/; (????)←「$1」の内容を変数に代入したい : : } close(IN); というように、テキストファイルの文章中の 「あい(.*?)うえお」から(.*?)を取り出して、 その取り出した(.*?)を変数に代入したいのですが、 いろいろ試してやっているのですが、難儀して おります。どのように書いたらいいか教えてください。よろしくお願いします。 最終的にclose(IN);のあとで、print 変数;として(.*?)の文字列を表示させたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
パターンマッチ自体はできていると思います。 後は文字コードの問題だと思います。 file.txtの文字コードと、書き出すhtmlファイルの文字コードは合ってないだけでは? (文字コードは詳しくないのであんまり自信無し)
その他の回答 (2)
open(IN,"<file.txt"); while (<IN>){ $a=$1 if /あい(.*)うえお/; } で入りません? もし入らないのなら、パターンマッチ自体がうまくいっていないのだと思います。 (本当にやりたいパターンマッチは 「あい(何とか)うえお」ではないのでしょうから、 こういう場合、本当にやりたいことをそのまま 書いた方がよいアドバイスをもらえると思いますよ。) ちなみに、もし文の途中に「あい(.*)うえお」が出て来る場合にマッチさせたいなら、 /.*あい(.*)うえお.*/ としないとだめでないですかね? (確かめてないので自信無し)
お礼
ご回答どうもありがとうございます。 本当にやりたいパターンマッチはNo.1さんのところの お礼で書かせていただきました。 教えていただいたように書いてみたのですが、 うまく表示されません。 ご指摘いただけると幸いです。 open(IN,"<file.txt"); while(<IN>){ $hiniti=$1 if/\\date\{(.*?)\}/; } close(IN); use encoding 'shiftjis'; print $hiniti; ブラウザ上での表示は次のようになりました。 \x{00e5}\x{00b9}\x{00b3}\x{00e6}\x{0088}\x{0090}16\x{00e5}\x{00b9}L11\x{00e6}\x{009c}\x{0088}1\x{00e6}\x{0097}\x{00a5} よろしくお願いします。
- e2101183
- ベストアンサー率16% (1/6)
普通に$str=$1ではダメ、ということですね? 少々異なる処理になりますが、私がHTMLからタイトルなどを抽出した時に用いた処理を流用しますと、 open(IN,"<file.txt"); @file = <IN>; close(IN); foreach(@file) { $_ =~ /あい(.+?)うえお/i; if($1 ne '') {$str = $1; } } これで最後にHITしたものが$strに入ります。 (.+?)がプラスになっているのは、1文字以上でないとHITしないようにしたからです。
お礼
早速のご回答ありがとうございます。 実際のやりたいパターンマッチは、 s/\\date\{(.*?)\}/$1/; というものです。 file.txt中に、\date{平成16年11月1日}という部分 がありまして、それの「平成16年11月1日」という部分を取り出して、変数に入れたいと思っています。 教えてくださった方法で書いてましたが、どこかおかしいのでしょうか。結果がうまく表示されません。 open(IN,"<file.txt"); @file = <IN>; close(IN); foreach(@file) { $_ =~/\\date\{(.*?)\}/i; if($1 ne '') {$str = $1; } } use encoding 'shiftjis'; print $str; とすると、ブラウザ上には次のように表示されました。 \x{00e5}\x{00b9}\x{00b3}\x{00e6}\x{0088}\x{0090}16\x{00e5}\x{00b9}L11\x{00e6}\x{009c}\x{0088}1\x{00e6}\x{0097}\x{00a5} ------------- 上のパタンマッチの場合だと、平成16年11月1日と 表示させたいのですが、よろしくお願いします。 ActivePerl5.8.4を使用しております。
お礼
早速のご回答ありがとうございます。 パターンマッチは成功しているということなので、 安心いたしました。 文字コードの問題なのですね。 調べてみます。 いろいろアドバイスいただきましてありがとうございました