高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

改行コードに注意

  my($filename) = @_;
  my(@lines);
  if(open(FILE, $filename)) {
    # ファイルロード
    #@lines = ;
    foreach(){ push(@lines, $_); }
    close FILE;
    return @lines;
  }else{ return (); }

このようなコードでファイルを読み込んで配列にしまう場合、
foreach()は、改行コードを含んで行を$_にしまうようなので、s/[\n\r]+///などとしてよけいな改行文字を全部削除しないといけないようです。C言語のfgetsでもそうだったかな?
ストリームクラスなどを使って一発で読み込むのが一般的になった今となっては、ちょっと忘れがちな問題です。

foreach(){ push(@lines, $_); }

ではなく、

foreach(){ 
  s/[\n\r]+///;
  push(@lines, $_); 
}

とすれば何とかなります。chomp関数でも良いのかな、よく分らないですが。

 えーっと、上のコードではコメントアウトしてる、@lines = ;と言う文ならば、問題は起こらないのかもしれないです。たぶん起こらないでしょう。
この構文はCPUを食うからCGIとしては非推奨だとか言う話をどこかで聞いた気がするんですが…。どこだったかなぁ…。