------------------------------------------------------------------------------- open(F, "ファイル名"); while(<F>) { # ここで $_ に1行分の文字列が入っている。 # $_ に対して加工を施す ... } close(F); -------------------------------------------------------------------------------これは1行ずつ読み取って処理しているので遅いのです。
------------------------------------------------------------------------------- open(F, "ファイル名"); while(read(F, $readbuf, 1024)) { # ここで $readbuf には最大1024byte(1024の値は適当)が入っている。 $buf .= $readbuf; # そのまま $buf へくっつける } close(F); # $bufにファイルの全内容がそのまま入っている。 # $bufを加工をするなり何なりと。 -------------------------------------------------------------------------------秘技!
------------------------------------------------------------------------------- open(F, "ファイル名"); undef $/; # <> に改行を認識させなくする $buf = <F>; # 全部を一気に読み込む! close(F); # $bufにファイルの全内容がそのまま入っている。 # $bufを加工をするなり何なりと。 -------------------------------------------------------------------------------
------------------------------------------------------------------------------- open(F, "ファイル名"); while(<F>) { push @buf, $_; } close(F); # @bufにファイルの全内容が1行ずつそのまま入っている。 -------------------------------------------------------------------------------秘技!
------------------------------------------------------------------------------- open(F, "ファイル名"); @buf = <F>; close(F); # @bufにファイルの全内容が1行ずつそのまま入っている。 -------------------------------------------------------------------------------
------------------------------------------------------------------------------- eval { open(F, "hogehoge.dat") or die("データファイルが開けませんでした\n"); hogehoge() or die("hogehogeができませんでした\n"); ... } or do { # die() で死んだ時にここへ来る。 # $@ には die() の文字列が入っている! # die() の文字列に \n を付けていない場合、$@ へ行番号や # スクリプトのファイル名が追加される。 # 上の例のように、文字列の最後に \n を付けるとそれらは追加されない。 chomp($errmsg=$@); # $@を$errmsg にコピーし、$errmsgの\nを除去 print "Content-type: text/plain\n\n"; print "エラー! $errmsg。至急、管理者(045-xxx-xxxx) へ連絡して下さい。"; exit; }; # ←ブロックの最後にセミコロンを忘れないように -------------------------------------------------------------------------------
------------------------------------------------------------------------------- for(@hoge) { # $_ に配列の要素が入っている ... } # $_ではなく他の変数へ入れたい場合、 # for $elem(@hoge) のようにする -------------------------------------------------------------------------------
------------------------------------------------------------------------------- for(0..$#hoge) { # $_ に 0から始まる数値が入っている # $hoge[$_] として配列の要素を取り出せる } # $_ではなく他の変数へ入れたい場合、 # for $i(0..$#hoge) のようにする -------------------------------------------------------------------------------・1から始まるループのカウントを知りたいループ
------------------------------------------------------------------------------- for(1..@hoge) { # $_ に 1から始まる数値が入っている # 1から始まるので、配列のインデックスとして使うには -1 してやる # ただループの回数だけ知りたいときはコレ。 } -------------------------------------------------------------------------------上2つは、ループ内で1を足すか足さないかだけの違いですが、不精者には重要。
------------------------------------------------------------------------------- while(($k,$v)=each(%hoge)) { ... } -------------------------------------------------------------------------------が! last や return などでこのループを途中で抜けた場合、再び each(%hoge) でループをさせようとすると、 抜けた次から続行してしまいます。 (反復子がリセットされないため)
1 while(each %hoge); # ループが終わるまで、何もせず回る や keys %hoge; # これでも反復子はリセットできるで明示的にリセットさせなければなりません。
------------------------------------------------------------------------------- for $k(keys %hoge) { $v = $hoge{$k}; ... } -------------------------------------------------------------------------------↑いつもこの形を使えば安全だが、いちいちキーから値を取るのが面倒…