ディレクトリハンドルの現在のシークポインタを取得する
telldir
は、DIRHANDLE 上での readdir
ルーチンの現在位置を返します。
現在位置の値は、seekdir
に与えることで、そのディレクトリの読み取り位置を変更することができます。
次のコードは、opendir
でディレクトリを開いた直後の現在位置、そして、
readdir
によって得られたファイル名と、その時点の現在位置を出力します。
opendir my $dh, './sample';
print telldir($dh), "\n";
while ( my $file = readdir $dh ) {
print $file, "\n";
print telldir($dh), "\n";
}
上記コードを Ubuntu などの Linux 環境で実行すると、次のような結果が出力されます。
0
.
1
..
2
test1.txt
3
test2.txt
4
この結果を見ての通り、telldir
は 0 から順に読み取ったエントリの数だけ位置が増えていきます。
一方で、同じコードを Windows で実行すると、次のような結果が出力されます。
0
.
2
..
5
test1.txt
15
test2.txt
-1
Windows では現在位置が 0 から始める点は Linux と同じですが、ディレクトリ内のエントリを読み取っても 1 ずつ増えていくわけではありません。
さらに、読み取りが終わると、その位置は -1 になってしまいます。
このように、telldir
から得られる現在位置の値は、環境によって異なりますので注意が必要です。