- ベストアンサー
Perlにおけるレコードセパレータについて
Perl初心者、現在独学中です。 複数プラットフォームで作られたテキストベースのデータファイル群を ファイルハンドルから開き readline で読み込む際、3つの改行文字の 全てに入力レコードセパレータ(特殊変数$/)を対応させたいのですが、 どのようにすれば良いのでしょうか。 ファイルサイズが大きいもので500~600MB程ありますので undef $/; で 全て読み込むのは余り現実的ではなく1行ずつ評価したいのです。 無理なようでしたら、代替案(ファイルの先頭64KBだけを読み込む等)を ご教示頂きたいと思います。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Perlではレコードセパレーターに正規表現を与えることはできません。 ですから、$/ = "\r?\n"; だとか"[\r\n]|\r\n" のような設定ができません。 $/に数値もしくは数値を保持するスカラー変数のリファレンスを設定してやると、 レコードをその数値の長さからなる固定長のものとして読み込みを行います。 Remember: the value of $/ is a string, not a regex. awk has to be better for something. :-) Setting $/ to a reference to an integer, scalar containing an integer, or scalar that's convertible to an integer will attempt to read records instead of lines, with the maximum record size being the referenced integer. So this: local $/ = \32768; # or \"32768", or \$var_containing_32768 open my $fh, $myfile or die $!; local $_ = <$fh>; will read a record of no more than 32768 bytes from FILE. If you're not reading from a record-oriented file (or your OS doesn't have record-oriented files), then you'll likely get a full chunk of data with every read. If a record is larger than the record size you've set, you'll get the record back in pieces. Trying to set the record size to zero or less will cause reading in the (rest of the) whole file.
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
補足で訊かれていることに対する回答も書いてありますよ。 ちゃんと読んでます? さらに別の方法としては sysread を使うというものがあります。
お礼
申し訳ありません、英文の頭2行までしか読まず、それ以下はawkのことを 書いているのだとだと勝手に解釈しておりました。 正に考えていた通りのもので返す言葉も御座居ません。 誠に有難う御座居ました。
補足
早速の御回答、有難う御座居ます。 申し訳ありませんが、正規表現は既に試しております。 また、配列を渡しても期待する結果は得られませんでした。 Perlはマルチプラットフォームの側面が強く思えるので、 開発の現場には定石のようなものがあるのかと思い質問しました。 代替案についてですが、ファイルの先頭から指定したサイズだけ 読むような方法が仮にあればマッチングで改行文字を割り出し、 セパレータに代入することで問題は済むと考えました。 もしそのような方法を御存知でしたら御教示戴ければ幸いです。 上記代替案に関わらずとも、名案・妙案が御座居ましたら、 メモリ消費量を抑えた形で実現できれば過程には拘りません。 何卒、宜しくお願い致します。