免费注册 查看新帖 |

Chinaunix

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

perl的回调函数,谁能举个例子吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-03 17:58 |只看该作者 |倒序浏览
搞了大半天搞不懂回调函数真正的意思,网上搜到的都是用File::Find实现的,感觉不能完全理解

谁能举个perl的回调函数例子

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
2 [报告]
发表于 2013-07-03 18:56 |只看该作者
看看anyevent的抓网页的例子
done()就是回调函数
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use AnyEvent;
  5. use AnyEvent::HTTP;

  6. my $cocurrent = 100;    # 并发数
  7. my @todoList = map { "keyword" . $_ } (1 .. 1000); # 待查询的关键词

  8. my $cv = AnyEvent->condvar;

  9. doit() foreach 1..$cocurrent;

  10. sub doit{
  11.     my $word = shift @todoList;
  12.     return if not defined $word;

  13.     $cv->begin;
  14.     http_get( "http://www.baidu.com/s?wd=$word", sub { done( $word, @_ ) } );
  15. }

  16. sub done {
  17.     my ($word, $content, $hdr) = @_;

  18.     $cv->end();
  19.     print "Search: $word\tStatus: ", $hdr->{Status}, "\n";
  20.     doit();
  21. }

  22. $cv->recv();
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-07-03 19:38 |只看该作者
回复 2# laputa73

这个我知道,jquery的ajax异步回调也能看懂。就是perl中不用模块,能举个回调函数的例子吗
   

论坛徽章:
1
CU大牛徽章
日期:2013-03-14 14:08:55
4 [报告]
发表于 2013-07-03 19:47 |只看该作者
在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

没啥不好理解的呀,就是向函数的参数为   一个函数的引用呀。。
  1. sub  callback1 {
  2.     ......
  3. }

  4. sub  callback2 {
  5.    ......
  6. }

  7. sub run {
  8.    my $func_ref = shift;
  9.   .....
  10.   ....
  11. }
  12. if (a>b) {
  13.      run(\&callback1);
  14. }
  15. else {
  16.     run(\&callback2);
  17. }
复制代码

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
5 [报告]
发表于 2013-07-03 20:35 |只看该作者
本帖最后由 laputa73 于 2013-07-03 20:36 编辑

回复 3# gknhjqx


    那看看定时器的例子?
  1. $timeout = 2 ;
  2. while(1){        
  3.   eval {               
  4.    local $SIG{ALRM} = sub{print "sorry,time out.please try again\n"} ;               
  5.    alarm $timeout ; # 定义一下超时器               
  6.   print "hello world!\n" ;                 
  7.    sleep 3 ;               
  8.    alarm 0 ; # 取消超时器        } ;
  9.   die $@ if $@ ;
  10. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2013-07-03 21:26 |只看该作者
回复 4# jun413947139


能不能加上具体变量等写完整一点,我想跑一下试试   

论坛徽章:
0
7 [报告]
发表于 2013-07-03 21:27 |只看该作者
回复 5# laputa73


这例子也知道。。有没有像4楼那样的   

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
8 [报告]
发表于 2013-07-03 23:34 |只看该作者
本帖最后由 laputa73 于 2013-07-04 08:54 编辑

你想要的是函数指针的例子吧.
  1. #!/bin/env perl
  2. use strict;
  3. #1.只有一个参数时可以省略().和lua一样
  4. sub f1($){
  5. my($a)=@_;
  6. print "$a->{a}.\n";
  7. }

  8. sub f2($){
  9. my($a)=@_;
  10. print "$a->{b}.\n";
  11. }

  12. f1{"a","b","1","2"};

  13. #output
  14. #-bash-3.00$ perl testf.pl
  15. #b.


  16. #2.使用变量名调用函数
  17. my $fname="f1";
  18. #&{\&{$fname}}({"a","b","1","2"}); #这里不能省略()
  19. &{\&$fname}({"a","b","1","2"});

  20. my $f=\&{$fname};
  21. #my $f=\&$fname;  #可以省略{}
  22. &$f({"a","b","1","2"});  #这里不能省略()

  23. my $cmd="${fname}({'a','b','1','2'});";
  24. #eval($cmd);
  25. eval("${fname}({'a','b','1','2'});");

  26. #output.以上相同
  27. #-bash-3.00$ perl testf.pl
  28. #b.
  29. #b.


  30. #3.函数赋值给变量
  31. #和lua不同,lua要求调用函数没有参数时,必须加().否则代表函数赋值
  32. #而perl则是要求函数赋值时必须加\&
  33. #即$f=f1在perl里面代表函数调用(标量) ,而f=f1在lua里面代表函数赋值
  34. my  $ff=\&f1;
  35. &$ff({"a","b","1","2"});
  36. $ff=\&f2;
  37. &$ff({"a","1","b","2"});
  38. $ff=f1{"a","1","b","2"};
  39. &$ff;
  40. #-bash-3.00$ perl testf.pl
  41. #b.
  42. #b.
  43. #1.
  44. #2.

  45. my {$fff}=&f1;
  46. fff({"a","b","1","2"});

  47. #4.匿名函数
  48. sub f3{
  49.         return  sub{
  50.          my($a)=@_;
  51.    print "$a->{a}.\n";
  52.   }
  53. }
  54. $ff=f3;
  55. &$ff({"a","1","b","2"});
  56. #-bash-3.00$ perl testf.pl
  57. #b.
  58. #b.
  59. #1.
  60. #2.
  61. #1.

  62. #5.闭包
  63. sub f4{
  64.         my $b=shift;
  65.         return sub{
  66.          my($a)=@_;
  67.    print "$a->{$b}.\n";
  68.   }               
  69. }       

  70. $f=f4("a");
  71. &$f({"a","1","b","2"});
  72. $f=f4("b");
  73. &$f({"a","1","b","2"});
复制代码

论坛徽章:
0
9 [报告]
发表于 2013-07-06 13:01 |只看该作者
回复 8# laputa73

不是啊,我就是想看一个不用模块的,用perl实现的回调函数的例子啊
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP