- ベストアンサー
perl での文章の取得について
prel において、 open(FILE, "<ABC.txt") $comment = FILE; $comment =~ s/\t//g; 以上のことができますか。つまりFILEの文章において、タグをなくすということです。もしだめならどうすればよいでしょうか
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
「prel」が「per」lの、「タグ」が「タブ」の間違いだとして。 「文章において、タグをなくす」→可能です。 ただ、やりかたに問題があります $comment = FILE; 直接ファイルハンドルを使っても、ファイルから読み込むことはできません。 普通は<FILE>と、ダイアモンド演算子を使います。 $comment = <FILE> ; 通常は1行ずつなので、ループで全体を処理します。 @comment = <FILE> ; リストのコンテンツでは、全体を読み込んで1行1要素のリストにします。 undef $/ ; $comment = <FILE> ; 特殊変数$/が「区切り」なので、未定義にしたらファイル全体を一度に読み込みます。 あとは、これは読んだだけなので、明示的に出力させなければ、見掛けなにもしていないように見えます。
その他の回答 (4)
- kmee
- ベストアンサー率55% (1857/3366)
> $data=$comment =~ s/\s//g; これで置換すると、空白一文字ずつ置換されるので、 > (間にスペースが4つあります) の部分で、4回置換を行なっていることになります。 複数の空白をまとめるなら s/\s+//g と、一個以上を表す+を付けるとよいでしょう。 ところで。 空白の数を見るだけなら、置換せずとも m/\s+/g でマッチングだけやれば元の文字列を破壊しなくてもすみます。 あるいは、split(/\s+/,$comment)などとして単語のリストにしてしまうのも方法の一つです。
お礼
\s+にすればできました。ありがとうございました。またの機会によろしく
- koba0626
- ベストアンサー率67% (19/28)
open(FILE, "<ABC.txt") || die $!; flock(FILE, 1); @comment = <FILE>; foreach my $line (@comment) { $line =~ s/\t//g; print "$line"; } close(FILE); ^^;;;;;;;
- koba0626
- ベストアンサー率67% (19/28)
訂正自己レスです。 >foreach my $comment (@comment) { ここで$comment は使えないですね。。。 ↓こんな感じならわかりやすいでしょうか。 open(FILE, "<ABC.txt") || die $!; flock(FILE, 1); @comment = <FILE>; foreach my $line (@comment) { $comment =~ s/\t//g; print "$line"; } close(FILE);
- koba0626
- ベストアンサー率67% (19/28)
>以下でよいでしょうか。 >open(FILE, "<ABC.txt"); >undef $/ ; >$comment = <FILE> ; >$comment =~ s/\t//g; >print "$comment"; 先頭の一行だけを処理したいのなら正しいです。^^;; ただし、ファイルハンドル全体で処理したいのならループさせる必要があります。 例えば、ファイルハンドルを配列に詰め込むように書けば、一行ずつ配列の要素に代入してくれますので、 ↓こんな感じで処理できます。 open(FILE, "<ABC.txt") || die $!; flock(FILE, 1); @comment = <FILE>; foreach my $comment (@comment) { $comment =~ s/\t//g; print "$comment"; } close(FILE); >2)空白を省く場合、正規表現を「\s」にすればよいですか よいです。^^ 正規表現で使えるメタ文字ならこの辺↓がわかりやすく書かれてると思います。 http://perl.misty.ne.jp/meta.html#d
補足
丁寧なご説明ありがとうございました。配列のprintの方法が分かりました。 ところでこの質問の出発点は単語数を調べるためです。以下をごらんください。 (例) ABC.txtの文章「This is a book(間にスペースが4つあります) You are tall」(簡単のためにピリオドは付けません) open(FILE, "<ABC.txt"); undef $/ ; $comment = <FILE> ; $data=$comment =~ s/\s//g; print "$data"; 単語数が間違ってしまいます。どうすればよいでしょうか
補足
kmeeさん、ご返事ありがとございます。 >「prel」が「per」lの、「タグ」が「タブ」の間違いだとして すみません、まちがえました。 以下でよいでしょうか。 open(FILE, "<ABC.txt"); undef $/ ; $comment = <FILE> ; $comment =~ s/\t//g; print "$comment"; 質問 1)\tは$/にするのですか 2)空白を省く場合、正規表現を「\s」にすればよいですか よろしくお願いします。