- 论坛徽章:
- 0
|
不废话,直接上code,关于tie的用法的内容,书上的代码是这样的:- #!/usr/bin/perl -w
- package TieFile;
- my $F_OFFSETS = 0;
- my $F_FILEHANDLE = 1;
- sub TIEARRAY{
- my ($pkg, $filename) = @_;
- open $fh, $filename || die "Could not open file: $!\n";
- bless [[0], $fh], $pkg;
- }
- sub FETCH{
- my ($obj, $index) = @_;
- my $rl_offsets = $obj->[$F_OFFSETS];
- my $fh = $obj->[$F_FILEHANDLE];
- if($index > @$rl_offsets){
- $obj->read_until($index);
- }
- else{
- seek $fh, $rl_offsets->[$index], 0;
- }
- return scalar<$fh>;
- }
- sub STORE{
- die "Sorry. Cannot updata file using package TieFile\n";
- }
- sub DESTORY{
- my $obj = shift @_;
- close($obj->[$F_FILEHANDLE]);
- }
- sub read_until{
- my ($obj, $index) = @_;
- my $rl_offsets = $obj->[$F_OFFSETS];
- my $last_index = @$rl_offsets - 1;
- my $last_offset = $rl_offsets->[$last_index];
- my $fh = $obj->[$F_FILEHANDLE];
- seek $fh, $last_offset, 0;
- while(<$fh>){
- $last_offset += length($_);
- $last_index ++;
- push @$rl_offsets, $last_offset;
- last if $last_index > $index;
- }
- }
- 1;
复制代码 上述代码存入一名为"TieFile.pm"的文件中,然后在另一个文件中使用此package:- #!/usr/bin/perl -w
- use TieFile;
- tie @lines, "TieFile", "TieFile.pm";
- print $lines[0];
- print $lines[1];
- print $lines[2];
复制代码 打印结果是:- #!/usr/bin/perl -w
- Use of uninitialized value in seek at TieFile.pm line 20, <$fh> line 1.
- #!/usr/bin/perl -w
- my $F_FILEHANDLE = 1;
复制代码 结果明显不对啊。请高手解答,谢谢~
详细内容可以参看《高级Perl编程》 中国电力出版社 第一版 Sriram Srinivasan著 Perlisb译,第185页和184页。 |
|