+ -
当前位置:首页 → 问答吧 → 说说Perl(5)让你不爽的地方

说说Perl(5)让你不爽的地方

时间:2010-10-27

来源:互联网

咱们都是perler啦。。无疑热爱这门语言。
每门语言都有弱点,Perl肯定也有一些不好之处。
比如,最让俺不爽的是Perl的无类型。。

sub x{ return 1 }

返回值既可看作字符又可看作数字,这在很多场合并不严谨。。

黑色阳光的那篇帖子也无疑表达了Perl的某些弱项(语法黑洞)。
大家还有其他想法,欢迎补充和探讨~~

作者: 兰花仙子   发布时间: 2010-10-27

沙发...

没有象delphi那样强大,方便开发的GUI,使得用来写桌面应用程序很困难

作者: iamlimeng   发布时间: 2010-10-27

的确无类型通常很方便,但是有些时候太郁闷了, object 比较是否是同一个[id一样]的时候用字符串比较,数字比较都感觉很无力 也不知是不是我这需求太无力

作者: zhlong8   发布时间: 2010-10-27

本帖最后由 黑色阳光_cu 于 2010-10-27 12:32 编辑

把字符串"1" 转成 数字1的方法是:

my $n = "1";
$n + 0;
  1. my $n = "1";
  2. my @ar = qw(1.0 2.0 3.0 4.0 5.0);
  3. if ($n + 0 ~~ @ar)
  4. {
  5.         warn "yes";
  6. }
  7. else
  8. {
  9.         warn "no";
  10. }
复制代码
一斤汗

作者: 黑色阳光_cu   发布时间: 2010-10-27

为什么都喜欢用 warn 输出 我喜欢 say

作者: zhlong8   发布时间: 2010-10-27

本帖最后由 黑色阳光_cu 于 2010-10-27 12:50 编辑

$1, $2, $3 ... $n 是正则的分组
$0却是执行程序的名字
而$-[0] $+[0]却又是$&的偏移

作者: 黑色阳光_cu   发布时间: 2010-10-27

本帖最后由 黑色阳光_cu 于 2010-10-27 12:52 编辑

正则匹配在LIST上下文的返回值的不一致性:
分 有没分组 和 有没g修饰,组合一共4种情况:

1) 没分组,没g修饰
my @ar = "abcdefg" =~ /../;
$ar[0]为匹配成功次数1
;;
2) 没分组,有g修饰
my @ar = "abcdefg" =~ /../g;
@ar却为每次匹配的$&
;;
3) 有分组,没g修饰
my @ar = "abcdefg" =~ /(.)(.)/;
@ar为一次分组內容
;;
4) 有分组,有g修饰
my @ar = "abcdefg" =~ /(.)(.)/g;
@ar为多次分组內容

主要是没分组,没g修饰的时候,返回一次$&才合理,而不是返回1

作者: 黑色阳光_cu   发布时间: 2010-10-27

本帖最后由 黑色阳光_cu 于 2010-10-27 13:34 编辑
  1. while (my $line = <FILE>)
复制代码
这里用的却是defined测试

do while中,last要这样子用:
  1. {
  2.         do
  3.         {
  4.                 last;
  5.         } while (1);
  6. }
复制代码
next要这样子用:
  1. my $n = 10;
  2. do
  3. {{
  4.         next if ($n % 2);
  5.         warn $n;
  6. }} while ($n-- > 0);
复制代码
prototype:
  1. warn prototype("func");        # 这个检查发生在运行时,所以可以打印$ $
  2. warn func(5);        # 编译时没看到prototype

  3. sub func($ $)
  4. {
  5.         return $_[0] + $_[1];
  6. }

  7. warn &func(10);        # &方式调用不会被检查prototype
  8. my $ref = \&func;
  9. warn $ref->(15);        # ->方式不会被检查prototype
  10. warn &$ref(20);        # &方式调用不会被检查prototype
复制代码
注意上面的$ $之间我故意插入了一个空格,不然会被论坛程序转义

函数返回值:
对于很多Perl內置函数来说,真是返回字符串"1",假是返回字符串"",个人认为应该返回数字1和undef更合理。更特别的,Perl里一些对系统API封装的函数,比如fcntl,由于API返回0是代表成功,所以Perl封装的函数是返回一个字符串"0 but true",这样子感觉很山寨,个人认为这里的0应该解释为出错代号,出错代号0代表着成功,用户既然用了某个函数,就有责任知道函数调用返回值的准确含义,而不是简单的靠真假来判断是否调用成功。

作者: 黑色阳光_cu   发布时间: 2010-10-27