アプリ版:「スタンプのみでお礼する」機能のリリースについて

perl の文字列カウント

こんにちは。初質問になります。perのlプログラミングについての質問です。
ある文章の「文末」の文字列をカウントし、出力するプログラムをつくりたいと思っています。
以下の文字列カウントプログラムを元に作りたいのですが、正規表現の文末指定のつけどころが恥ずかしながらわかりません。

<テキストデータ例>
やまだくんはみかんを食べています!!たかしくんはりんごを食べています!!
ひろしくんは好きなみかんを食べています!!
??よしこさんは嫌いなりんごを食べていますか??
かなえさんはいつもぶどうを食べています(^-^)
ひろしくんはみかんが好きです(^-^)しかし、ゆうじくんはみかんは好きではありません(^-^)
ひろみさんはみかんとぶどうは嫌いです!!しかし、りんごは好きです。

たとえば上のテキストデータを読み込み
文末のビックリマーク、クエスチョンマークの文字列を検出し
個数をカウントし出力するするようなプログラムです。

<出力結果>
(^-^) 2
!! 2
?? 1

となるようにしたいです。
以下のプログラムだと文末に限らずリストにあてはまる全ての記号がカウントされてしまいます。

@arr = qw('(^-^)','!!','??' );
$fname = "input.txt";
open(IN,"$fname") || &error("Can't open $fname");
read(IN,$buff,-s IN);
close (IN);
foreach (@arr){
$cnt = scalar( () = $buff =~ /$_/g );
print "$_ $cnt\n";
}

A 回答 (2件)

条件に行の末尾とあるので、正規表現に改行 (\n) を含めるのも一つのやり方です。



@arr = ('(^-^)','!!','??'); # @arr = qw('(^-^)','!!','??' ); は誤り
・・・
$cnt = () = $buff =~ /\Q$_\E\n/g;

なお、@arr の (^-^) の丸括弧が全角で<テキストデータ例>では丸括弧が半角、@arr の !! と ?? が半角で≪テキストデータ例>では全角になっているので、このままでは全くマッチしません。単なる誤記なのかもしれませんが、統一することが必要です。
    • good
    • 0

あなたの言う「文末」とは?


改行の直前のことなら、複数行モードが使えます
http://perldoc.jp/docs/perl/5.16.1/perlreref.pod

文章の意味で区切るなら、まずは解析が必要です。

あと、メタ文字に注意
    • good
    • 0

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