免费注册 查看新帖 |

Chinaunix

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

按你自己喜欢的语法写perl程序 (转译) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-06 10:31 |只看该作者 |倒序浏览
perl当然是一门非常棒的语言, 不过它当然也不完美。很多时候,一些很自然的解决方法却不能和它很‘自然’的吻合。有时候你会想,要是让perl按照你的语法来就好了 ;)例如, perl的例程不能指定参数列表一直非议很大,比如你不能这样写:
  1. my @NUMERAL_FOR    = (0..9,'A'..'Z');

  2. sub convert_to_base($base, $number)
  3. {
  4.     my $converted  = "";
  5.     while ($number > 0)
  6.     {
  7.         $converted = $NUMERAL_FOR[$number % $base] . $converted;
  8.         $number    = int( $number / $base);
  9.     }
  10.     return $converted;
  11. }
复制代码



你只能这样:

  1. sub convert_to_base
  2. {
  3.     my ($base, $number) = @_;   # <-- 只能手工指定参数。。。。

  4.     my $converted       = ''
  5.     while ($number > 0)
  6.     {
  7.         $converted      = $NUMERAL_FOR[$number % $base] . $converted;
  8.         $number         = int( $number / $base);
  9.     }

  10.     return $converted;
  11. }
复制代码



perl程序员的优点(缺点?)之一就是懒惰,所以很多很多人这样写:

  1. sub convert_to_base
  2. {
  3.     my $converted  = '';

  4.     while ($_[1] > 0)
  5.     {
  6.         $converted = $NUMERAL_FOR[$_[1] % $_[0]] . $converted;
  7.         $_[1]      = int( $_[1] / $_[0]);
  8.     }

  9.     return $converted;
  10. }
复制代码
天哪,对于后来的维护人员来说,简直是噩梦!(这个人往往是你自己,不过过了几个月之后,你可能也要重新看代码。)解决方案:perl 并不完美, 不过你可以自己动手让它完美。perl 5.8以后的版本,提供了一种方法,可以在源代码送入编译器以前,用你希望的方式先做某些改变。这里我介绍一种最简单的办法: 用Filter::Simple来写自己的模块以修改perl语法。其实思路很简单,perl编译器只会关心最终送过来的源代码,我们只要使用filter模块把源代码变成编译器能够识别就行了。下面的简单例子,就使perl的例程增加了参数声明功能:
  1. package Sub::With:arams;
  2. use Filter::Simple;
  3. my $IDENT = qr/[^\\W\\d]\\w*/;
  4. FILTER_ONLY code => sub{    s{ ( sub \\s* $IDENT \\s* )   # 例程名
  5.                                                         (   \\( .*? \\)        )   # 参数列表      
  6.                                                         (   \\s* \\{           )   # 例程体    }   
  7.                                                     {$1$3 my $2 = \\@_;}gxs;    #替换为编译器认识的代码};
  8. 1;
复制代码
大功告成! 现在你可以高高兴兴的按照下面的方式来写:
  1. use Sub::With:arams;
  2. sub convert_to_base($base, $number)
  3. {   
  4. my $converted  = '';   
  5. while ($number > 0)    {        
  6. $converted = $NUMERAL_FOR[$number % $base] . $converted;      
  7. $number    = int( $number / $base);    }   

  8. return $converted;}
复制代码


在送到编译器以前,Sub::With:arams 会把你的代码转成以下形式:
  1. sub convert_to_base { my ($base, $number) = @_;   
  2. my $converted  = '';   
  3. while ($number > 0)    {        
  4. $converted = $NUMERAL_FOR[$number % $base] . $converted;        
  5. $number    = int( $number / $base);    }   
  6. return $converted;}
复制代码
怎么样?很简单吧。这是大面先生的优秀作品,也是5.8以后的标准模块。大家可以用perldoc 查看详细用法。

[ 本帖最后由 flw 于 2007-9-6 13:58 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-09-06 10:49 |只看该作者
各位哪个给我排一下版?这么好的文章不搞漂亮点可惜了。

论坛徽章:
0
3 [报告]
发表于 2007-09-06 11:23 |只看该作者
天哪你真懒

perl当然是一门非常棒的语言,不过它当然也不完美。很多时候,一些很自然的解决方法却不能和它很‘自然’的吻合。有时候你会想,要是让perl按照你的语法来就好了 ;)例如, perl的例程不能指定参数列表一直非议很大,比如你不能这样写:
  1. my @NUMERAL_FOR    = (0..9,'A'..'Z');

  2. sub convert_to_base($base, $number)
  3. {
  4.     my $converted  = "";
  5.     while ($number > 0)
  6.     {
  7.         $converted = $NUMERAL_FOR[$number % $base] . $converted;
  8.         $number    = int( $number / $base);
  9.     }
  10.     return $converted;
  11. }
复制代码

你只能这样:
  1. sub convert_to_base
  2. {
  3.     my ($base, $number) = @_;   # <-- 只能手工指定参数。。。。

  4.     my $converted       = ''
  5.     while ($number > 0)
  6.     {
  7.         $converted      = $NUMERAL_FOR[$number % $base] . $converted;
  8.         $number         = int( $number / $base);
  9.     }

  10.     return $converted;
  11. }
复制代码

perl程序员的优点(缺点?)之一就是懒惰,所以很多很多人这样写:
  1. sub convert_to_base
  2. {
  3.     my $converted  = '';

  4.     while ($_[1] > 0)
  5.     {
  6.         $converted = $NUMERAL_FOR[$_[1] % $_[0]] . $converted;
  7.         $_[1]      = int( $_[1] / $_[0]);
  8.     }

  9.     return $converted;
  10. }
复制代码

天哪,对于后来的维护人员来说,简直是噩梦!(这个人往往是你自己,不过过了几个月之后,你可能也要重新看代码。)

解决方案:perl 并不完美, 不过你可以自己动手让它完美。perl 5.8以后的版本,提供了一种方法,可以在源代码送入编译器以前,用你希望的方式先做某些改变。这里我介绍一种最简单的办法: 用Filter::Simple来写自己的模块以修改perl语法。其实思路很简单,perl编译器只会关心最终送过来的源代码,我们只要使用 filter模块把源代码变成编译器能够识别就行了。下面的简单例子,就使perl的例程增加了参数声明功能:
  1. package Sub::With:arams;

  2. use Filter::Simple;

  3. my $IDENT = qr/[^\\W\\d]\\w*/;

  4. FILTER_ONLY code => sub {
  5.         s{
  6.            ( sub \\s* $IDENT \\s* )   # 例程名
  7.            (   \\( .*? \\)        )   # 参数列表      
  8.            (   \\s* \\{           )   # 例程体   
  9.          }  
  10.          {
  11.            $1$3 my $2 = \\@_;
  12.          }gxs;    #替换为编译器认识的代码
  13. };

  14. 1;
复制代码

大功告成! 现在你可以高高兴兴的按照下面的方式来写:
  1. use Sub::With:arams;

  2. sub convert_to_base($base, $number) {
  3.         my $converted = '';
  4.         while ( $number > 0 ) {
  5.                 $converted = $NUMERAL_FOR[ $number % $base ] . $converted;
  6.                 $number    = int( $number / $base );
  7.         }

  8.         return $converted;
  9. }
复制代码

在送到编译器以前,Sub::With:arams 会把你的代码转成以下形式:
  1. sub convert_to_base {
  2.         my ( $base, $number ) = @_;
  3.         my $converted = '';
  4.         while ( $number > 0 ) {
  5.                 $converted = $NUMERAL_FOR[ $number % $base ] . $converted;
  6.                 $number    = int( $number / $base );
  7.         }
  8.         return $converted;
  9. }
复制代码

怎么样?很简单吧。这是大面先生的优秀作品,也是5.8以后的标准模块。大家可以用perldoc 查看详细用法。

[ 本帖最后由 nkcsx 于 2007-9-6 12:25 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-09-06 11:30 |只看该作者
多谢楼上, 终于有一个人回帖,让我心里没有打击太大。 我本打算吃饭回来还没有人回,就删贴。

论坛徽章:
0
5 [报告]
发表于 2007-09-06 11:55 |只看该作者
顶!!!!!!!!!

[ 本帖最后由 bilbo0214 于 2007-9-6 11:56 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-09-06 13:55 |只看该作者
我是看了,但是,发现你文章里面本来就有[code]...[//code]这样的东西

[ 本帖最后由 perljoker 于 2007-9-6 13:58 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-09-06 13:59 |只看该作者
我倒,flw老大,为什么他刚才代码没识别为code,什么地方错了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP