こんばんは。
ファイルを読み込んで、改行だけの行を省いて、上書きしたいのですが
なぜかうまくいきません。
ループ内にある改行の判定をするIF文がいけないと思うのですが…。
教えていただけないでしょうか?
また、シングルクォーテーションダブルっクォーテーションは同じ意味
なのですか?「""」と「''」
作ったプログラムは以下です。
open(OUT,">$ssifile");
#改行のみのデータは除く
@newtbl = ();
foreach $siline ( @slines)
{
if ($slines ne "\n") {
push @newtbl, $siline;
}
}
print OUT @newtbl;
close(OUT);
宜しくお願いいたします。
No.1ベストアンサー
- 回答日時:
if文のところだけ、変数の名前が違うのが原因では?
他では $siline となっているのに、ここだけ $slines ですが・・・
クォートの違いについてですが、文字列を生成するという点では違いはありません。
ただ、文字列中に書かれた変数が、ダブルでは展開されるのに対し、シングルでは展開されません。
また、エスケープ文字も、シングルの方では \' と \\ 以外は無効になります。
例えば、$a = 123; の時、
print "$a\'\\\nXYZ";
では
123'\
XYZ
と表示されるのに対し、
print '$a\'\\\nXYZ';
では
$a'\\nXYZ
と表示されます。
# CGI=Perl ではないので、この手の質問は Perl でしましょう。
No.2
- 回答日時:
まず、ダブルクォートとシングルクォートについては、leaz024さんの回答通り、変数展開されるかされないかの違いと、エスケープシーケンス処理(\nなどが展開)されるかされないかの違いがあります。
同じだと思いこんでるといつか痛い目に遭います。変数展開が必要な物はダブルクォートで、必要ない物はシングルクォートで囲むよう癖をつけておくといいでしょう。また、ダブルクォートやシングルクォート以外に好きな記号を使うこともできます。
下記はダブルクォート""と同じ、変数$textの中身が表示される
print qq{$text}, qq#$text#, qq%$text%, qq|$text|;
下記はシングルクォート''と同じ、$textという文字列が表示される
print q{$text}, q!$text!, q($text), q?$text?;
記号の前にqqをつけるとダブルクォートと同じ、qだとシングルクォートと同じです。
ただし、() [] {} など、かっことして意味のある記号を使う場合、対応するかっこを使う必要があります。また、記号自身を含む場合\でエスケープしてやるのは同じです。
これは使いこなすと便利です。
例えば <img src="$file.gif" alt="a"> という文字列を変数展開ありで、処理したいとします。
ダブルクォートを使うと、
print "<img src=\"$file.gif\" alt=\"a\">";
と、中の"の前に\を付けて全部エスケープしてやらないといけなくて面倒です。一個でもエスケープを忘れると構文エラーになります。
好きな記号を使えることを知っておけば、
print qq|<img src="$file.gif" alt="a">|;
と、スマートに安全に書けます。
で、本題のファイル処理ですが、いろいろ方法はありますが、私が好んで使うのは、下記のような一時ファイルに出力し、renameで上書きするものです。
------------------------------------------------------------------------
my $file = 'test.txt'; # ファイル名
open(IN, "$file") or die $!; # 読み取り用で開く
open(OUT, ">$file.tmp") or die $!; # 一時ファイルを出力用に開く
while (<IN>) { # 1行ずつ処理する
next if /^\n*$/; # 改行だけの行は無視
print OUT $_; # 一時ファイルに出力
}
close(IN);
close(OUT);
rename("$file.tmp", $file) or die $!; # 一時ファイルを元ファイルにリネーム(上書き)
------------------------------------------------------------------------
上記はファイルが大きいときでも1行分しかメモリを消費しないで済みます。
@lines = <IN>; などと、全行読み込んでから処理すると、極端な話、1GBのファイルなら1GBメモリが消費されます。さらに別の配列にコピーなどしてたら2GB。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LaTeXのinputの応用について
-
AutoNts
-
window.open でのファイル指定方法
-
繰り返し表示
-
fgets で値が取得できない
-
区切りファイルの列ソートについて
-
MATLABのm-fileについて
-
VBA テキストファイルを読み取...
-
ファイルの存在の有無を確かめ...
-
圧縮された.tgzファイルの一部...
-
close()で例外が投げられる理由
-
タブの色を変更する方法
-
[perl] もっとシンプルに改良、...
-
エクセルVBA コードが同じでも...
-
バッチファイルの作り方(CSV→...
-
VBAでCSVファイルの特定行を書...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBScriptでファイル保存先のデ...
-
FORTRANのプログラミング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python renameについて
-
window.open でのファイル指定方法
-
MATLABのm-fileについて
-
fgets で値が取得できない
-
csvファイルの横方向への改行に...
-
巨大なテキストの最終行を取得...
-
Firefox で file:// で始まる U...
-
JSP URLに表示される拡張子 .jsp
-
重複ファイル名ある場合ファイ...
-
ファイルの存在の有無を確かめ...
-
ファイル全てを .xlsm に変更し...
-
PerlでのUseless use...
-
行を指定して削除する方法PERL
-
VBA テキストファイルを読み取...
-
HTMLのフォームで画像と文...
-
perl ファイルが開かない
-
並び方、
-
read() on unopened filehandle...
-
drtファイルはどうしたら開...
-
VBAコードを張り付け後のエクセ...
おすすめ情報