Posts Tagged 引用
Perl中建立一个实例方法的线程
标题有点复杂吧?其实就是新建一个线程,来运行某个对象实例中的特定函数。
一般在Perl中新建一个线程的方法很简单:
- use threads;
- my $th = threads->create( function_ref, parameters );
但是启动一个实例中的函数就不太一样了,因为不能用 \&$object->method 来取得该函数的引用。
因为自己写脚本的时候有用到,于是花了一个下午探索实验。然后发现一个确实可以work的办法:在一个匿名函数中调用该方法。
不过这个做法实在是丑陋,Perl这样灵活的语言,一定可以有更好的办法来解决这种问题。
实验加翻阅Intermediate perl一个下午还是无果,突然Perl帝出现,看了一眼代码后瞬间给出一个非常正规的解决方法。
具体请直接看示例代码:
下载: cat.pm
- package Cat;
- use strict;
- use warnings;
- sub new {
- my $class = shift;
- my $self = {
- hello => 'Miao',
- @_
- };
- return bless $self, $class;
- }
- sub sayhi {
- my $self = shift;
- my $times = shift || 3;
- foreach ( 1 .. $times ) {
- print "$self->{hello}\n";
- sleep 1;
- }
- }
- 1;
下载: sayhi.pl
- #!/usr/bin/perl
- use strict;
- use warnings;
- use threads;
- use FindBin qw($Bin);
- use lib "$Bin";
- use Cat;
- my $cat = Cat->new( hello => 'meow' );
- # solution 1: works but ugly
- print "\n+++++++ solution 1 +++++++\n";
- my $th1 = threads->create( sub { $cat->sayhi(4); } );
- foreach ( 1 .. 4 ) {
- print "This is main function.\n";
- sleep 1;
- }
- $th1->join;
- # solution 2: more professional
- print "\n+++++++ solution 2 +++++++\n";
- my $th2 = threads->create( \&Cat::sayhi, $cat, 4 );
- foreach ( 1 .. 4 ) {
- print "This is main function.\n";
- sleep 1;
- }
- $th2->join;
- print "\nDemo ends.\n";









