3

我想将文件句柄存储在 Perl 对象中。这是我的做法。

sub openFiles {
     my $self = shift;
     open (my $itemsFile, "<", "items.txt")     or die $!;
     open (my $nameFile,  "<", "FullNames.txt") or die $!;      
     $self->{itemsFile} = $itemsFile;                   
     $self->{nameFile}  = $nameFile;
     return $self;
}

然后我希望从这些文件之一中访问一些信息。这是我的做法。

sub getItemDescription {
     my $self = @_;
     chomp(my $record = $self->{itemsFile});
     return $record;
}

我尝试在另一个过程中访问它,如下所示:

print "Test 3: $self->getItemDescription()\n";

我的问题如下:

  1. 我在对象中保存文件句柄的方式是否正确?如果不是,那怎么错了?
  2. 我读取文件行的​​方式是否正确?如果没有,我怎样才能正确?
  3. 最后,我打印返回对象的方式是否正确?

这对我来说真的很重要。如果有任何方法可以改进我的代码结构,即为文件处理创建一个全局变量或更改对象的结构,请告诉我。

4

3 回答 3

4

我在对象中保存文件句柄的方式是否正确?

是的。

我读取文件行的​​方式是否正确?

不,这只是分配文件句柄。使用运算符从文件中读取一行readline

通常会使用运算符的<...>语法readline,但它是and<...>的快捷方式,Perl 认为是 的缩写。你必须专门使用readline(...)glob(qq<...>)<$self->{itemsFile}>glob(qq<$self->{itemsFile}>)readline

my $record = readline($self->{itemsFile});
chomp($record) if defined($record);

或做一些额外的工作

my $fh = $self->{itemsFile};
my $record = <$fh>;
chomp($record) if defined($record);

(请注意,我不会chomp无条件调用,因为readline/<>可以返回 undef。)

最后,我打印返回对象的方式是否正确?

我认为您的意思是返回的字符串,如getItemDescription. 问题是,您从未真正调用过该方法。->getItemDescription()在双引号字符串文字中没有任何意义,即使在变量之后也是如此。您需要移出$self->getItemDescription()双引号。

您也无法检查是否已到达文件末尾。

于 2013-01-16T04:37:51.847 回答
2

你很亲密。

要从文件句柄中读取记录(行),请在将文件句柄分配给“简单标量”之后使用内置readline函数或运算符(请参阅下面的编辑)。<...>

chomp(my $record = readline( $self->{itemsFile} );

my $fh = $self->{itemsFile};
chomp(my $record = <$fh>);

getItemDescription您的方法中也存在错误。你会想说

my ($self) = @_;

代替

my $self = @_;

后一个调用是数组的标量赋值,它解析为数组的长度,而不是数组的第一个元素。

编辑:<$self->{itemsFile}>并且<{$self->{itemsFile}}>不工作,perlop解释

如果尖括号中的内容既不是文件句柄,也不是包含文件句柄名称、typeglob 或 typeglob 引用的简单标量变量,则将其解释为要通配的文件名模式,以及文件名列表或列表中的下一个文件名根据上下文返回。这种区别仅由句法基础决定。这意味着<$x>始终是readline()来自间接句柄的 a,但<$hash{key}>始终是 a glob()。这是因为$x它是一个简单的标量变量,但$hash{key}不是——它是一个散列元素。甚至<$x >(注意多余的空格)被视为glob("$x "),而不是readline($x)

于 2013-01-16T04:39:17.957 回答
0

openFiles段子是对的。

错误主要发生在getItemDescription方法上。

my $self = @_;首先应如前所述my ($self) = @_;

但是,问题的症结是通过以下方式解决的:

改为chomp(my $record = $self->{itemsFile});两行:

$file1 = $self->{itemsFile};

chomp(my $record = $file1);

为了澄清你必须(根据我的经验,我尝试了所有建议的解决方案)使用标量值。

最后,请参阅ikagami回答的最后两段。

于 2013-01-23T14:55:44.250 回答