Почему FileHandle :: getpos для вновь открытого дескриптора возвращает пустую строку, а не 0? - PullRequest
3 голосов
/ 26 июня 2010

Я пытаюсь использовать getpos в Perl.Я использую объект FileHandle в приведенном ниже коде, и он, похоже, не работает.Может кто-нибудь сказать мне, что я делаю не так?

use strict;
use warnings;
use FileHandle;

my $fh = new FileHandle;
$fh->open("<test.txt") or die "$!";
my $pos = $fh->getpos;
print "pos: \"$pos\"\n";

Вывод:

pos: ""

Я ожидаю, что "0" будет выводить ...

Ответы [ 2 ]

4 голосов
/ 26 июня 2010

Обратите внимание на предостережение (выделение добавлено) в документации :

Если доступны функции C fgetpos и fsetpos, то FileHandle::getpos возвращает непрозрачное значение , которое представляет текущую позицию FileHandle, а FileHandle::setpos использует это значение для вернуться на ранее посещенную позицию.

Непрозрачный означает, что вы не должны обращать внимание на значение: используйте его только в качестве параметра в будущих запросах от модуля.

Почему бы не использовать операторы Perl tell и seek?

#! /usr/bin/perl

use warnings;
use strict;

open my $fh, "<", $0 or die "$0: open: $!";
print tell($fh), "\n";

Вывод указанной выше программы, как и ожидалось, 0.

4 голосов
/ 26 июня 2010

Документация для FileHandle гласит, что значение, возвращаемое getpos, является непрозрачным значением, что означает, что в целом вы не можете предполагать что-либо значимое в отношении значения.Единственное, для чего это хорошо - это вернуться к setpos.Это соответствует базовым системным вызовам, используемым для реализации метода (fgetpos и fsetpos), которые представлены в C как непрозрачные fpos_t указатели.Методы seek и tell, если доступны, используют целочисленные позиции файла, которыми можно манипулировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...