Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370383
  • 博文数量: 61
  • 博客积分: 2451
  • 博客等级: 上尉
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-06 21:24
文章分类

全部博文(61)

文章存档

2012年(1)

2011年(44)

2010年(16)

分类: LINUX

2011-01-17 21:18:14

map:
Perl里面的map, 是一种道具,可以让你的函数或者表达式,很方便地施用到一系列对象上去。

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长了。

  1. [root@PC_IN_LAN learnperl]#cat a
  2. #!/usr/bin/perl
  3. @list=(0x53,0x77,0x65,0x64,0x65,0x6e,012);
  4. @words = map chr, @list;
  5. print @words;
  6. [root@PC_IN_LAN learnperl]#./a
  7. Sweden

(兰花仙子的简简单单讲map)
read 函数
格式:
read (filehand, $var, $length, $offset)
filehand:文件句柄
$var:存放读取到的字符
$length:读取字节数
$offset:第四个参数很关键,可是是正正数也可以是负整数。
$offset 只和 $var 相关,可以这么理解: 首先将 $var 截短为 $offset 长的字符串,如果不足就补\0; 然后  $var .= "读到的内容"
正数表示保留的字节数,负数表示截去的字节数,都是从右边往左边截。
  1. [root@PC_IN_LAN learnperl]#more test
  2. 0123456789
  3. [root@PC_IN_LAN learnperl]#cat a
  4. #!/usr/bin/perl -w
  5. open FH, ";
  6. read FH, $var,4;
  7. print $var,"\n";
  8. read FH,$var,2,2;
  9. print $var,"\n";
  10. read FH,$var,2,-3;
  11. print $var,"\n";

  12. [root@PC_IN_LAN learnperl]#./a
  13. 0123
  14. 0145
  15. 067
seek 函数
seek 设置文件的当前位置!当一个文件非常大时可以从指定位置读起。
seek FILEHANDLE,POSITION,WHENCE   成功返回真,失败返回假。
POSITION 是读入的新位置(字节)。
WHENCE   有3个值,0表示新位置是POSITION,1表示当前位置加上POSITION,2表示文件尾加上POSITION
例如:从file.txt的12字节开始读起并打印出来。
open (FILEHANDLE,") or die "cannot open file.txt";
seek FILEHANDLE,12,0;
while (){
        print;
}
close (FILEHANDLE);

flock 函数
对文件进行加锁 解锁
flock (filehand, operatename)
四种operatename
  共享锁,读锁(s锁),该进程给该文件加上s锁后,其他进程只能给该文件加s锁不能加x锁(排他锁:写锁),即其他进程和该进程只能对文件进行读,不能进行修改。如果该进程给该文件加上了x锁后,其他进程不能加s锁也不能加x锁,只能允许该进程对文件进行修改。
非阻塞锁,即当进程不能为文件加锁时,不是阻塞到等待队列(这样照成上下文切换开销比较大),而是继续进行其他的任务。直到该文件释放锁。

阅读(4145) | 评论(0) | 转发(0) |
0

上一篇:perl 学习笔记

下一篇:perl 命令行

给主人留下些什么吧!~~