Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2396005
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: Python/Ruby

2012-12-15 12:27:46

“绑定(tie)”变量是什么意思?这里,动词“tie(绑定)”是作为“bind(绑定)”的同义词来使用的。绑定变量基本上就是将函数绑定到内部触发器上以读写该变量。这意味着,作为一名程序员,在使用变量时您可以让 Perl 做额外的事情。如果从这个简单的前提出发,那么绑定接口已经演变为 Perl 中的面向对象方法了,它将 OOP 的复杂性隐藏在过程接口后面。

一般只需要接触三类主要的绑定变量:标量、数组和散列。因为绑定文件句柄比较复杂,所以它们属于比较高级的主题。

下面仅仅介绍一些比较简单的例子,更多详细的信息请参考perldoc文档, , , , , 以及

一 绑定标量

以 Tie::Scalar::Timeout 模块为例:
  1. use Tie::Scalar::Timeout;
  2. tie my $k, 'Tie::Scalar::Timeout', EXPIRES => '+2s';
  3. $k = 123;
  4. sleep(3);
  5. # $k is now undef
第一部分,其中调用了 tie() 函数,演示了如何告诉 Perl 变量 $k 实际上绑定到了 Tie::Scalar::Timeout 包。在幕后,Perl 运行 Tie::Scalar::Timeout 模块的 TIESCALAR() 函数(这实质上有些象对一个常规对象调用 new() )。 TIESCALAR() 返回一个 Tie::Scalar::Timeout 类型的对象,该对象被赋给 $k 。

示例中传递给 Tie::Scalar::Timeout 的特定参数确保了它会在两秒钟之后超时。该模块还提供了其它选项,如在读了确定次数之后就超时。

二 绑定数组

以Tie::CharArray 为例
  1. use Tie::CharArray;
  2. my $foobar = 'a string';
  3. tie my @foo, 'Tie::CharArray', $foobar;
  4. $foo[0] = 'A'; # $foobar = 'A string'
  5. push @foo, '!'; # $foobar = 'A string!'
现在你就可以像在C/C++/Java里面一样操作字符串了。

还有一个Tie::File的例子。

  1. use Tie::File;
  2. tie @array, 'Tie::File', filename or die ...;

  3. $array[13] = 'blah'; # line 13 of the file is now 'blah'
  4. print $array[42]; # display line 42 of the file

  5. $n_recs = @array; # how many records are in the file?
  6. $#array -= 2; # chop two records off the end

  7. for (@array) {
  8.   s/PERL/Perl/g; # Replace PERL with Perl everywhere in the file
  9. }

  10. # These are just like regular push, pop, unshift, shift, and splice
  11. # Except that they modify the file in the way you would expect

  12. push @array, new recs...;
  13. my $r1 = pop @array;
  14. unshift @array, new recs...;
  15. my $r2 = shift @array;
  16. @old_recs = splice @array, 3, 7, new recs...;

  17. untie @array; # all finished
这里建立了一个list和file的关系,对list的操作会反映到file上去。

阅读(3694) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~