免费注册 查看新帖 |

Chinaunix

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

有点无语的Perl语法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-25 09:20 |只看该作者 |倒序浏览
本帖最后由 黑色阳光_cu 于 2010-10-25 10:25 编辑
  1. open(FILE, ">", "urfile.txt");
  2. open(*FILE, ">", "urfile.txt");
复制代码
第1种方式,FILE是一个裸词,open会期许在第1个参数出现裸词,并自动转为对应的GLOB,结果等价于第2种方式。

假如第3个参数出现裸词,却又和打开的方式有关:

  1. open(NEWFD, ">&", STDOUT);        # 正确
  2. open(NEWFD, ">&", *STDOUT);        # 正确
  3. open(NEWFD2, "<&", STDIN);        # 报错
  4. open(NEWFD2, "<&", *STDIN);        # 正确
复制代码
而print却不期许出现*XXX形式的句柄:
  1. print *STDOUT "hello world\n";        # 报错
  2. print STDOUT "hello world\n";        # 正确
复制代码
如果一定要用*STDOUT的话,需要把*STDOUT包装在语句块里,print第一个参数可接受语句块:
  1. print {*STDOUT} "hello world\n";
复制代码
==============================================

假如变量的值为undef,则perl会在需要时把变量转为需要的引用:
  1. my $val;
  2. push(@$val, 5);
  3. warn Dumper($val);
复制代码
  1. my %hash;
  2. foreach my $elem (1 .. 5)
  3. {
  4.         # $hash{$elem} = [];
  5.         push(@{$hash{$elem}}, $elem ** $elem);
  6. }
复制代码
=============================================
正则表达式,匹配和替换用的g修饰符却是不同的含义:
# 匹配用的g修饰符会让引擎从上次匹配的位置重新开始:
  1. my $str = "abcdefg";
  2. $str =~ /.{3}/g;
  3. if ($str =~ /(.)/g)
  4. {
  5.         warn $1;
  6. }
复制代码
# 替换用的g修饰符却是指全局替换:
  1. my $str = "abcdefg";
  2. $str =~ /.{3}/g;
  3. $str =~ s/(.)/\u$1/g;
  4. warn $str;
复制代码
# 如果要从上次匹配的位置开始替换的话,要写:

  1. my $str = "abcdefg";
  2. $str =~ /.{3}/g;
  3. $str =~ s/\G(.)/\u$1/;
  4. warn $str;
复制代码
==============================================

  1. warn \&func;        # \可以对函数取引用
  2. warn \&func();        # 但是给函数提供一个参数列表的话,就变成了对函数返回值取引用

  3. sub func
  4. {
  5.         return 0;
  6. }
复制代码
==============================================

not实际上是一个函数,所以not后面跟着一个切片的话:
  1. not (1)[0];        # 语法错
复制代码
要写:
  1. not + (1)[0]; 或者 not ((1)[0]);
复制代码

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
2 [报告]
发表于 2010-10-25 09:25 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2010-10-25 09:34 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2010-10-25 09:36 |只看该作者
:wink:

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2010-10-25 10:02 |只看该作者
open 那个的确是历史遗留很难看。别的要么是为了方便,要么是优先级问题。

楼主报怨的很有深度啊, Mastering Perl 上面说的“如果不能列出5个讨厌Perl的理由和事实,这就说明你对Perl的理解还不够。”。

看来楼主很有爱,很理解Perl啊,不过希望新人不要被误导才是

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2010-10-25 10:38 |只看该作者
个别措辞不是很准确。
大体上属于《UNIX 痛恨者手册》或者《千万别学英语》或者《C 陷阱与缺陷》类型的作品。
加个精华鼓励一下深入学习 Perl 的这种精神。

论坛徽章:
0
7 [报告]
发表于 2010-10-25 13:38 |只看该作者
最近也遇到两个问题,奇怪的很:
< $FH > 和 <$FH> 为什么<>中多了空格,为啥就不工作了?

$ab[0] = $fh;
print $fh 'aaa'; 和 print $ab[0] 'aaa'; 后者为啥要报语法错?

论坛徽章:
0
8 [报告]
发表于 2010-10-25 13:40 |只看该作者
回复 1# 黑色阳光_cu


    嗯,不错。学习……

论坛徽章:
0
9 [报告]
发表于 2010-10-25 13:57 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-10-25 14:11 编辑
最近也遇到两个问题,奇怪的很:
< $FH > 和  为什么中多了空格,为啥就不工作了?

$ab[0] = $fh;
prin ...
dugu072_cu 发表于 2010-10-25 13:38



   
应该是<>和print都要求句柄为裸词或者形如$fp的简单变量。否则,对于<>来说,则认为你是要glob扩展,比如< $FH >被认为是glob(" $FH "); 而对于print来说,print $ab[0] 'aaa' 会语法错,因为print会试图给句柄加上*转成GLOBTYPE,像这样子print *$ab[0] 'aaa',结果就是语法错,解决方案是把 $ab[0] 套在语句块里,像这样子print {$ab[0]} 'aaa'

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2010-10-25 14:23 |只看该作者
print $ab[0] 'aaa' 会语法错,因为print会试图给句柄加上*转成GLOBTYPE,像这样子print *$ab[0] 'aaa',结果就是语法错,解决方案是把 $ab[0] 套在语句块里,像这样子print {$ab[0]} 'aaa'


你这什么歪理邪说嘛。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP