免费注册 查看新帖 |

Chinaunix

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

有点无语的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]);
复制代码

论坛徽章:
0
2 [报告]
发表于 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'

论坛徽章:
0
3 [报告]
发表于 2010-10-25 14:25 |显示全部楼层
本帖最后由 黑色阳光_cu 于 2010-10-25 14:26 编辑
print $ab[0] 'aaa' 会语法错,因为print会试图给句柄加上*转成GLOBTYPE,像这样子print *$ab[0] 'aaa',结 ...
flw 发表于 2010-10-25 14:23





比较了,差不多。
print $ab[0] 'aaa';
print *$ab[0] 'aaa';

D:\>perl t.pl
String found where operator expected at t.pl line 7, near "] 'aaa'"
        (Missing operator before  'aaa'?)
syntax error at t.pl line 7, near "] 'aaa'"
Execution of t.pl aborted due to compilation errors.

D:\>perl t.pl
String found where operator expected at t.pl line 7, near "] 'aaa'"
        (Missing operator before  'aaa'?)
Global symbol "$ab" requires explicit package name at t.pl line 7.
syntax error at t.pl line 7, near "$ab["
Execution of t.pl aborted due to compilation errors.

论坛徽章:
0
4 [报告]
发表于 2010-10-25 14:30 |显示全部楼层
能不能更山寨一些?
flw 发表于 2010-10-25 14:30



论坛徽章:
0
5 [报告]
发表于 2010-10-25 14:38 |显示全部楼层
flw 发表于 2010-10-25 14:36




反正print不对~~~

论坛徽章:
0
6 [报告]
发表于 2010-10-25 14:47 |显示全部楼层
别瞎猜了,看代码吧。
在真相的基础上讨论,会更有价值一些。
比如可以讨论一下设计成这样有什么坏处,然 ...
flw 发表于 2010-10-25 14:43





Perl的源码有点艰深~~~

论坛徽章:
0
7 [报告]
发表于 2010-10-25 15:10 |显示全部楼层
QWERT键盘也是人体工程学的成果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP