- 论坛徽章:
- 0
|
本帖最后由 黑色阳光_cu 于 2010-10-25 10:25 编辑
- open(FILE, ">", "urfile.txt");
- open(*FILE, ">", "urfile.txt");
复制代码 第1种方式,FILE是一个裸词,open会期许在第1个参数出现裸词,并自动转为对应的GLOB,结果等价于第2种方式。
假如第3个参数出现裸词,却又和打开的方式有关:
- open(NEWFD, ">&", STDOUT); # 正确
- open(NEWFD, ">&", *STDOUT); # 正确
- open(NEWFD2, "<&", STDIN); # 报错
- open(NEWFD2, "<&", *STDIN); # 正确
复制代码 而print却不期许出现*XXX形式的句柄:- print *STDOUT "hello world\n"; # 报错
- print STDOUT "hello world\n"; # 正确
复制代码 如果一定要用*STDOUT的话,需要把*STDOUT包装在语句块里,print第一个参数可接受语句块:- print {*STDOUT} "hello world\n";
复制代码 ==============================================
假如变量的值为undef,则perl会在需要时把变量转为需要的引用:- my $val;
- push(@$val, 5);
- warn Dumper($val);
复制代码- my %hash;
- foreach my $elem (1 .. 5)
- {
- # $hash{$elem} = [];
- push(@{$hash{$elem}}, $elem ** $elem);
- }
复制代码 =============================================
正则表达式,匹配和替换用的g修饰符却是不同的含义:
# 匹配用的g修饰符会让引擎从上次匹配的位置重新开始:- my $str = "abcdefg";
- $str =~ /.{3}/g;
- if ($str =~ /(.)/g)
- {
- warn $1;
- }
复制代码 # 替换用的g修饰符却是指全局替换:- my $str = "abcdefg";
- $str =~ /.{3}/g;
- $str =~ s/(.)/\u$1/g;
- warn $str;
复制代码 # 如果要从上次匹配的位置开始替换的话,要写:
- my $str = "abcdefg";
- $str =~ /.{3}/g;
- $str =~ s/\G(.)/\u$1/;
- warn $str;
复制代码 ==============================================
- warn \&func; # \可以对函数取引用
- warn \&func(); # 但是给函数提供一个参数列表的话,就变成了对函数返回值取引用
- sub func
- {
- return 0;
- }
复制代码 ==============================================
not实际上是一个函数,所以not后面跟着一个切片的话:要写:- not + (1)[0]; 或者 not ((1)[0]);
复制代码 |
|