为什么新打开的句柄上的FileHandle :: getpos返回空字符串而不是0?

时间:2010-06-25 21:23:59

标签: perl file-io

我正在尝试在Perl中使用getpos。我在下面的代码中使用了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 个答案:

答案 0 :(得分:4)

FileHandle的文档说getpos返回的值是一个不透明的值,这意味着通常你不能假设有关该值的任何有意义的东西。它唯一的好处就是回到setpos。这与用于实现方法(fgetpos和fsetpos)的底层系统调用相匹配,这些方法在C中表示为不透明的fpos_t指针。 seektell方法(如果可用)使用可以操作的整数文件位置。

答案 1 :(得分:4)

请注意documentation中的警告(强调添加):

  

如果C函数fgetposfsetpos可用,则 FileHandle::getpos会返回不透明值,表示FileHandle的当前位置,FileHandle::setpos使用该值返回之前访问过的位置。

不透明意味着您不应该注意该值:仅将其用作模块未来请求中的参数。

为什么不使用Perl的tellseek运营商?

#! /usr/bin/perl

use warnings;
use strict;

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

上述程序的输出为0,正如您所期望的那样。