プロが教えるわが家の防犯対策術!

Perlでのファイルの読込なんですが、

open(IN,"A.txt");
while ($xx = <IN>) { print $xx;}
close(IN)

とするとA.txtファイルの読込をするんですよね?
A.txtの中の一行だけを読込むというのはできるんでしょうか?
(10行あったら5行目を読込み、という感じです。)

A 回答 (5件)

 その5行目が始まる位置と文字数(共にバイト単位)が判明していれば読めます。

seek 関数と read 関数を使うんです。

 でも面倒くさいので、4行目までを無駄に読み込みした方が早いですよ(^_^;
 処理速度としても、ファイルを開いて読み込んで、を何千回も繰り返すというのでないかぎり、それほど苦にはならないと思いますし。

この回答への補足

ありがとうございます。
読込んで、表示もさせたいのですがseek関数とread 関数というのでできますか?
ちなみにそれは難しいのでしょうか(^_^; ?

補足日時:2002/06/05 13:44
    • good
    • 0

読み込まない訳ではないですが



open(IN,"A.txt");
@file = <IN>;
close IN;

print "$file[4]\n";

というのは如何でしょう?

但し、A.txt のサイズが大きいとメモリを大量に消費してしまいますが。
    • good
    • 0

初めまして。


結論から言いますと期待した結果を得る様にコードを書けば何でも不可能では無いです。:-)
以下、例です。

ーーーここからーーー
#! /usrlocal/bin/perl

$count = 0;
$viewline = 5;

open(IN,"A.txt");
while(<IN>){
if($count == ( $viewline - 1)){
$line = $_;
last;
}
$count++;
}
close(IN);
print "LINE = $line\n";
ーーーここまでーーー

で出来ます。
$viewlineの変数を表示したい行番号を入れれば該当した行番号が表示されますし、while文内のif文の$viewlineの箇所に直接表示したい行番号を入れてもOKです。
参考まで…
    • good
    • 0

$. という変数に、「ファイルから読み込んだ行数(最後に読み込んだ行番号)」が自動的にセットされるので、これを利用してもよいかも。



open(IN,"A.txt");
while ($xx = <IN>) {
  if ($. == 5) {
    print $xx;
  }
}
close(IN);

ご参考までに、while の () の中で <IN> を単体で使う(値を変数で受け取らない)と、その値は $_ に入ってくれます。
なので、先のプログラムは次のようにも書けます。

open(IN,"A.txt");
while (<IN>) {
  if ($. == 5) {
    print $_;
  }
}
close(IN);

5行目以降のデータが必要ない場合、if文の中で last とかしてください。
    • good
    • 0

 seek と read は純粋に読み込むだけのための関数なので、表示は別途してあげなければいけません。



 どのみち、これらはバイナリデータを扱う際に便利なように出来ているので、行単位での読み込みには向いてないんですけどね(^_^;
    • good
    • 0
この回答へのお礼

ここにみなさんへのお礼を書かせてもらいます。
色々な方法を教えて頂き、本当にありがとうございました。あまり詳しくわからない為、勉強しながらなんとかやってみようと思っていたのですが、みなさんのおかげでとても助かりました。また何かつまずきましたら、その時はよろしくお願いします_(._.)_

お礼日時:2002/06/10 15:32

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