Perl中建立一个实例方法的线程

标题有点复杂吧?其实就是新建一个线程,来运行某个对象实例中的特定函数。

一般在Perl中新建一个线程的方法很简单:

  1. use threads;
  2. my $th = threads->create( function_ref, parameters );

但是启动一个实例中的函数就不太一样了,因为不能用 \&$object->method 来取得该函数的引用。

因为自己写脚本的时候有用到,于是花了一个下午探索实验。然后发现一个确实可以work的办法:在一个匿名函数中调用该方法。

不过这个做法实在是丑陋,Perl这样灵活的语言,一定可以有更好的办法来解决这种问题。

实验加翻阅Intermediate perl一个下午还是无果,突然Perl帝出现,看了一眼代码后瞬间给出一个非常正规的解决方法。

具体请直接看示例代码:

下载: cat.pm
  1. package Cat;
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. sub new {
  7.     my $class = shift;
  8.     my $self = {
  9.         hello => 'Miao',
  10.         @_
  11.     };
  12.     return bless $self, $class;
  13. }
  14.  
  15. sub sayhi {
  16.     my $self = shift;
  17.     my $times = shift || 3;
  18.  
  19.     foreach ( 1 .. $times ) {
  20.         print "$self->{hello}\n";
  21.         sleep 1;
  22.     }
  23. }
  24.  
  25. 1;
下载: sayhi.pl
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use threads;
  6. use FindBin qw($Bin);
  7. use lib "$Bin";
  8. use Cat;
  9.  
  10. my $cat = Cat->new( hello => 'meow' );
  11.  
  12. # solution 1: works but ugly
  13. print "\n+++++++ solution 1 +++++++\n";
  14. my $th1 = threads->create( sub { $cat->sayhi(4); } );
  15.  
  16. foreach ( 1 .. 4 ) {
  17.     print "This is main function.\n";
  18.     sleep 1;
  19. }
  20. $th1->join;
  21.  
  22. # solution 2: more professional
  23. print "\n+++++++ solution 2 +++++++\n";
  24. my $th2 = threads->create( \&Cat::sayhi, $cat, 4 );
  25.  
  26. foreach ( 1 .. 4 ) {
  27.     print "This is main function.\n";
  28.     sleep 1;
  29. }
  30. $th2->join;
  31.  
  32. print "\nDemo ends.\n";

, , ,

No Comments

山寨生活

  不是有部电视剧叫“我们无处安放的青春”吗,我脑子里突然蹦出个山寨的标题,叫“我无处安放的自行车”。

  还有个很囧的事情,我在公司班车上坐了20分钟后,突然觉得自己刚才好像因为等到一个自行车位太高兴而忘记刷卡还车了……Anyway, 到底我早上有没有还上车也只有等我晚上下班了才能知道了。

1 Comment

Well, well, well

  博客一个月没有更新,都快长草了。

  但其实不是我忘了这里,WordPress的后台留着6篇Draft,每篇都写了个主题就扔下了。

  你在看的这篇其实是第七篇,不过它运气比较好,而且在公交上很无聊。

  其实最关键是它没什么主题……我就随便来说点琐事。

  上个月最后一个周二是我实习的第一天,那晚下了公司班车后骑公用自行车(杭州便民的亮点之一啊)回住处。到了自行车租用点后,还车出了点问题(被一个MM在我还之前刷了下卡),等待工作人员来帮我解决问题已经是150分钟以后了=,=||。还好有个善解人意的MM陪我聊了很久,等待的过程也不是那么难熬了。

  五一回家腐败了下,YY很久的三国杀却没杀成。我的外甥女真的是超级爱我,巴不得每天都像树獭一样挂在我身上。并且有次我爸刚从外面买完彩票回来,她突然叫我爸“彩票娃”(那段时间她正迷葫芦娃),差点让我喷饭,接着我就被她封为“电脑娃”了,囧。

  今天在B1车站看到站上有一个二维码可以查询公交信息,于是马上用G3试着扫描了下,才发现不是QR Code,有现成的标准不用,另搞一套,这又是何必呢?

2 Comments

我还活着

  今天生日,昨晚感慨了下自己已经22了,结果被人说装嫩。

  其实干这事也不是第一次了,寒假出去吃饭啥的,每次别人问我年龄老妈都要纠正我的答案。用周岁好,似乎多出一年的时间,可以减轻我虚度光阴的内疚感。

  大四的最后几个月,自己到底需要什么是越来越清楚了。我需要一张毕业证书,需要继续跟自己的劣习做斗争,需要有点让我觉得面上有光的薪水。或者运气不错能得到自己期待中的Offer,或者还能找到一个MM给我带来这台破笔记本(虽然比不上惠普牌电暖炉)以外的温暖……至于到底哪些才是我真正想要的生活,我自己也不确信了。

  这段时间实验室也常待,自己买的书么也有看,玩么也玩得不少。每天早睡不晚起,似乎还干了蛮多事情的。不过奇怪的就是Google Tasks上面的条目几乎不见少,还差不多过个两天就增加那么几条。

  开学以来博客更新得不多,于是在Hero上装了个WordPress,希望有空就来写写。个人觉得把这个博客从(碎碎念+肤浅技术)博转型成冷笑话博也是不错的主意。

  我突然有一个想法:时间能冲淡激情和冲动,但也许有些情感即使在过了若干年以后,在你都差不多快淡忘的时刻,只需要那么小小的一根引线,就重新喷薄出来,消灭你对“时间带走一切”的信仰。

  其实上面那句话老早以前就写在Blog的草稿里了,不想浪费掉拿来凑字数了。最后谢谢送我礼物、打我电话、发我信息问候我(原则上排名不分先后,但是执意争取靠前的朋友明年请努力)的童鞋们,是你们让我觉得自己做人还做得不错,谢谢啦!

2 Comments

悼念

悼念你,我们都懂的。
同时祝福你。

,

1 Comment