• ベストアンサー

perl での文章の取得について

prel において、 open(FILE, "<ABC.txt") $comment = FILE; $comment =~ s/\t//g; 以上のことができますか。つまりFILEの文章において、タグをなくすということです。もしだめならどうすればよいでしょうか

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

「prel」が「per」lの、「タグ」が「タブ」の間違いだとして。 「文章において、タグをなくす」→可能です。 ただ、やりかたに問題があります $comment = FILE; 直接ファイルハンドルを使っても、ファイルから読み込むことはできません。 普通は<FILE>と、ダイアモンド演算子を使います。 $comment = <FILE> ; 通常は1行ずつなので、ループで全体を処理します。 @comment = <FILE> ; リストのコンテンツでは、全体を読み込んで1行1要素のリストにします。 undef $/ ; $comment = <FILE> ; 特殊変数$/が「区切り」なので、未定義にしたらファイル全体を一度に読み込みます。 あとは、これは読んだだけなので、明示的に出力させなければ、見掛けなにもしていないように見えます。

houseroof
質問者

補足

kmeeさん、ご返事ありがとございます。 >「prel」が「per」lの、「タグ」が「タブ」の間違いだとして すみません、まちがえました。 以下でよいでしょうか。 open(FILE, "<ABC.txt"); undef $/ ; $comment = <FILE> ; $comment =~ s/\t//g; print "$comment"; 質問 1)\tは$/にするのですか 2)空白を省く場合、正規表現を「\s」にすればよいですか よろしくお願いします。

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

> $data=$comment =~ s/\s//g; これで置換すると、空白一文字ずつ置換されるので、 > (間にスペースが4つあります) の部分で、4回置換を行なっていることになります。 複数の空白をまとめるなら s/\s+//g と、一個以上を表す+を付けるとよいでしょう。 ところで。 空白の数を見るだけなら、置換せずとも m/\s+/g でマッチングだけやれば元の文字列を破壊しなくてもすみます。 あるいは、split(/\s+/,$comment)などとして単語のリストにしてしまうのも方法の一つです。

houseroof
質問者

お礼

\s+にすればできました。ありがとうございました。またの機会によろしく

  • koba0626
  • ベストアンサー率67% (19/28)
回答No.4

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)
回答No.3

訂正自己レスです。 >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)
回答No.2

>以下でよいでしょうか。 >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

houseroof
質問者

補足

丁寧なご説明ありがとうございました。配列の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"; 単語数が間違ってしまいます。どうすればよいでしょうか

関連するQ&A

専門家に質問してみよう