+ -
当前位置:首页 → 问答吧 → 代码块能传给函数变量吗?

代码块能传给函数变量吗?

时间:2011-01-28

来源:互联网

比如我要处理某些网页,写这样一个函数

 sub fileterData{
      my ($url,$file,正则,代码块)=@_;

      getstore($url,$file);
      读文件
  @data= $文件内容 =~ 正则
  grep 代码块 @data

      reutnr @data;
   }

处理流程不变,这样用一个函数,传相应的正则和过滤代码块就可以抽取内容了

作者: yakczh   发布时间: 2011-01-28

本帖最后由 兰花仙子 于 2011-01-28 18:17 编辑

不一定要传block。
你可以传一个regex:
  1. mygrep(qr/^w{3}/);

  2. sub mygrep {
  3.     my $re = shift;
  4.     open HD,"/etc/passwd" or die $!;
  5.     my @c = grep /$re/,<HD>;
  6.     close HD;
  7.     print "@c";
  8. }
复制代码

作者: 兰花仙子   发布时间: 2011-01-28

  1. sub fileterData(&$)
  2. {
  3.         my ($code, $url, $file, $re) = @_;
  4.         warn "$code $url $file $re";
  5.         warn $code->();
  6. }

  7. fileterData
  8. {
  9.         print "code\n";
  10. } "http://www.google.cn", "data.txt", qr/\w+/;
复制代码

作者: 黑色阳光_cu   发布时间: 2011-01-28

正则已经传参数了,第三个参数是正则,问题是有些内容一个正则肯定取不出来,或者正则巨复杂,如果用一个简单的正则先预处理,然后再在代码块中写代码,这样就兼顾维护和灵活性

比如我抓页面,抓列表面与详情页其他流程都不变,就是抽取的部分不同,列表页可能就一个简单的正则就把列表项的内容取出来,但是详情页可能比较复杂,

这样如果传个代码块,这个代码块里面可以写很多代码,就要比只传正则要灵活得多了.

作者: yakczh   发布时间: 2011-01-28

上面的程序运行结果报错

Too many arguments for main::fileterData at E:\dev\perl\code-pass.pl line 12, near "qr/\w+/;"

作者: yakczh   发布时间: 2011-01-28