電子書籍の厳選無料作品が豊富!

prel において、

open(FILE, "<ABC.txt")
$comment = FILE;

$comment =~ s/\t//g;

以上のことができますか。つまりFILEの文章において、タグをなくすということです。もしだめならどうすればよいでしょうか

A 回答 (5件)

「prel」が「per」lの、「タグ」が「タブ」の間違いだとして。



「文章において、タグをなくす」→可能です。
ただ、やりかたに問題があります

$comment = FILE;
直接ファイルハンドルを使っても、ファイルから読み込むことはできません。
普通は<FILE>と、ダイアモンド演算子を使います。

$comment = <FILE> ;
通常は1行ずつなので、ループで全体を処理します。

@comment = <FILE> ;
リストのコンテンツでは、全体を読み込んで1行1要素のリストにします。

undef $/ ;
$comment = <FILE> ;
特殊変数$/が「区切り」なので、未定義にしたらファイル全体を一度に読み込みます。


あとは、これは読んだだけなので、明示的に出力させなければ、見掛けなにもしていないように見えます。

この回答への補足

kmeeさん、ご返事ありがとございます。

>「prel」が「per」lの、「タグ」が「タブ」の間違いだとして
すみません、まちがえました。

以下でよいでしょうか。

open(FILE, "<ABC.txt");

undef $/ ;
$comment = <FILE> ;

$comment =~ s/\t//g;

print "$comment";

質問
1)\tは$/にするのですか
2)空白を省く場合、正規表現を「\s」にすればよいですか
よろしくお願いします。

補足日時:2011/11/06 13:32
    • good
    • 0

> $data=$comment =~ s/\s//g;


これで置換すると、空白一文字ずつ置換されるので、
> (間にスペースが4つあります)
の部分で、4回置換を行なっていることになります。
複数の空白をまとめるなら
s/\s+//g
と、一個以上を表す+を付けるとよいでしょう。

ところで。
空白の数を見るだけなら、置換せずとも m/\s+/g でマッチングだけやれば元の文字列を破壊しなくてもすみます。
あるいは、split(/\s+/,$comment)などとして単語のリストにしてしまうのも方法の一つです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/09 23:22

open(FILE, "<ABC.txt") || die $!;


flock(FILE, 1);
@comment = <FILE>;
foreach my $line (@comment) {
$line =~ s/\t//g;
print "$line";
}
close(FILE);




^^;;;;;;;
    • good
    • 0

訂正自己レスです。



>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);
    • good
    • 0

>以下でよいでしょうか。


>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";

単語数が間違ってしまいます。どうすればよいでしょうか

補足日時:2011/11/07 16:05
    • good
    • 0

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