tokuhirom's Blog

__DATA__ の何行目をよんでいるかを知りたい

DATA からデータをよんでいるときに、今ソースコード全体のうち、何行目をよんでいるかを知りたいというケースがある。 そんな場合は以下のようにすればよいだろう。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.010000;
use autodie;
use Fcntl qw(:seek);

my $line_number;
my $pos = tell(*DATA);
seek DATA, 0, SEEK_SET;
read DATA, (my $buf), $pos;
$buf =~ s/\n/$line_number++/ge;
while (<DATA>) {
    warn $line_number + $. . " : " . $_;
}

__DATA__
hoge
fuga
hige

そもそも *DATA はどういう存在なのかを把握するところからはじめた方がよさそうだ。 *DATA というのは、パーザがファイルをよみこんでいるときに、DATA をみつけたらそこで読みこみを中止するので、そこまでファイルポインタが seek された状態になっている、というファイルハンドルがつかえる状態になっている、と考えておけばよいだろう。

これは本当に普通のファイルハンドルと同じなので、tell/seek などの関数を適用することが可能だ。 tell() で現在位置を取得し、現在位置までのデータを取得して、その中にふくまれる改行の数を数えれば、DATA の位置が把握できるというワケ。

あとはこの行数を #line などにくわせるなど、使い方は自由だ。