1. 让我们先看map的语法
map BLOCK LIST
map EXPR, LIST
BLOCK是一个用{}包围的代码块。EXPR可以是子函数名、正则表达式等。LIST是输入列表。
简单地说,map就是起了一个替代foreach循环的 作用,map会把数组LIST中的元素挨个取出,放到系统变量$_中,然后调用BLOCK去处理。值得强调的是,除非有很特殊的理由,不要去修改$_的 值,因为修改$_就是直接改了原始数组里的元素!BLOCK 处理过的结果由map返回,仍然是一个数组。
2. 一个例子:计算一系列文件大小
my @sizes = map { -s $_ } @filenames;
上面例子用-s操作取得一些文件的大小,存到数组中去。
3. 是不是说map函数的输入数组和输出数组一定等长呢?不一定的,看这个
my @books = ( 'Pride and Prejudice', 'Emma', 'Masfield Park', 'Sense and Sensibility', 'Nothanger Abbey', 'Persuasion', 'Lady Susan', 'Sanditon', 'The Watsons');
现在取出书名里面所有用到的单词,并且全部转换成大写
my @words = map { split( /\s+/, $_)} @books;
my @uppercases = map uc, @words;
在split起过作用之后,当然@words的长度要比@books长了。
- [root@PC_IN_LAN learnperl]#cat a
- #!/usr/bin/perl
- @list=(0x53,0x77,0x65,0x64,0x65,0x6e,012);
- @words = map chr, @list;
- print @words;
- [root@PC_IN_LAN learnperl]#./a
- Sweden
- [root@PC_IN_LAN learnperl]#more test
- 0123456789
- [root@PC_IN_LAN learnperl]#cat a
- #!/usr/bin/perl -w
- open FH, "<test";
- read FH, $var,4;
- print $var,"\n";
- read FH,$var,2,2;
- print $var,"\n";
- read FH,$var,2,-3;
- print $var,"\n";
- [root@PC_IN_LAN learnperl]#./a
- 0123
- 0145
- 067
seek FILEHANDLE,POSITION,WHENCE 成功返回真,失败返回假。
POSITION 是读入的新位置(字节)。
WHENCE 有3个值,0表示新位置是POSITION,1表示当前位置加上POSITION,2表示文件尾加上POSITION
例如:从file.txt的12字节开始读 起并打印出来。
open (FILEHANDLE,"<file.txt") or die "cannot open file.txt";
seek FILEHANDLE,12,0;
while (<FILEHANDLE>){
print;
}
close (FILEHANDLE);
下面是测试:
wc -c出来的字符数与perl length取出的字符数一致
#!/usr/bin/perl
use strict;
use Data::Dumper;
open FH,"<./poe.pl";
#my $length = length(<FH>);
#my $length;
#while(<FH>){
# $length += length($_);
#}
#print Dumper $length;
my $tl = -s "./poe.pl";
print Dumper $tl;
exit 0;
my $var;
seek(FH,1000,0);
read (FH,$var,120);
print Dumper $var;
转载于:https://blog.51cto.com/716378/629496