免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1938 | 回复: 2
打印 上一主题 下一主题

书上写错了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-06 10:23 |只看该作者 |倒序浏览
不废话,直接上code,关于tie的用法的内容,书上的代码是这样的:
  1. #!/usr/bin/perl -w
  2. package TieFile;
  3. my $F_OFFSETS = 0;
  4. my $F_FILEHANDLE = 1;

  5. sub TIEARRAY{
  6.   my ($pkg, $filename) = @_;
  7.   open $fh, $filename || die "Could not open file: $!\n";
  8.   bless [[0], $fh], $pkg;
  9. }

  10. sub FETCH{
  11.   my ($obj, $index) = @_;
  12.   my $rl_offsets = $obj->[$F_OFFSETS];
  13.   my $fh = $obj->[$F_FILEHANDLE];
  14.   if($index > @$rl_offsets){
  15.     $obj->read_until($index);
  16.   }
  17.   else{
  18.     seek $fh, $rl_offsets->[$index], 0;
  19.   }
  20.   return scalar<$fh>;
  21. }

  22. sub STORE{
  23.   die "Sorry. Cannot updata file using package TieFile\n";
  24. }

  25. sub DESTORY{
  26.   my $obj = shift @_;
  27.   close($obj->[$F_FILEHANDLE]);
  28. }

  29. sub read_until{
  30.   my ($obj, $index) = @_;
  31.   my $rl_offsets = $obj->[$F_OFFSETS];
  32.   my $last_index = @$rl_offsets - 1;
  33.   my $last_offset = $rl_offsets->[$last_index];
  34.   my $fh = $obj->[$F_FILEHANDLE];
  35.   seek $fh, $last_offset, 0;
  36.   while(<$fh>){
  37.     $last_offset += length($_);
  38.     $last_index ++;
  39.     push @$rl_offsets, $last_offset;
  40.     last if $last_index > $index;
  41.   }
  42. }

  43. 1;
复制代码
上述代码存入一名为"TieFile.pm"的文件中,然后在另一个文件中使用此package:
  1. #!/usr/bin/perl -w
  2. use TieFile;
  3. tie @lines, "TieFile", "TieFile.pm";
  4. print $lines[0];
  5. print $lines[1];
  6. print $lines[2];
复制代码
打印结果是:
  1. #!/usr/bin/perl -w
  2. Use of uninitialized value in seek at TieFile.pm line 20, <$fh> line 1.
  3. #!/usr/bin/perl -w
  4. my $F_FILEHANDLE = 1;
复制代码
结果明显不对啊。请高手解答,谢谢~
详细内容可以参看《高级Perl编程》 中国电力出版社 第一版 Sriram Srinivasan著 Perlisb译,第185页和184页。

论坛徽章:
0
2 [报告]
发表于 2011-10-06 12:18 |只看该作者
本帖最后由 Kitaisky 于 2011-10-06 12:31 编辑

USE STRICT !!!

How would $fh even compile AS in

"open $fh, $filename || die "Could not open file: $!\n";  ???

Download code here: http://shop.oreilly.com/product/9781565922204.do

论坛徽章:
0
3 [报告]
发表于 2011-10-06 13:31 |只看该作者
回复 2# Kitaisky

没理解您的意思,抱歉……AS是什么?
我用了use strict还是不行。
我把代码中第16行改成
  1. if($index > (@$rl_offsets-1)){
复制代码
第45行改成
  1. last if $last_index > $index-1;
复制代码
之后,倒是能打印出正确的结果了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP