perl map,seek,read
http://blog.chinaunix.net/space.php?uid=24504673&do=blog&id=91555
map:
Perl里面的map,是一种道具,可以让你的函数或者表达式,很方便地施用到一系列对象上去。 1. 让我们先看map的语法 map BLOCK 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; 在split起过作用之后,当然@words的长度要比@books长了。
http://bbs.chinaunix.net/viewthread.php?tid=632333#(兰 花仙子的简简单单讲map)
read 函数
格式:
read (filehand,$var,$length,$offset)
filehand:文件句柄
$var:存放读取到的字符
$length:读取字节数
$offset:第四个参数很关键,可是是正正数也可以是 负整数。
$offset 只和 $var 相关,可以这么理解: 首先将 $var 截短为 $offset 长的字符串,如果不足就补 ; 然后??$var .= "读到的内容"
正数表示保留的字节数,负数表示截去的字节数,都是从右边往左边截。
seek 函数
seek 设置文件的当前位置!当一个文件非常大时可以从指定位置读起。
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);
flock 函数
对文件进行加锁 解锁
flock (filehand,operatename)
四种operatename
??共享锁,读锁(s锁),该进程给该文件加上s锁后,其他进程只能给该文件加s锁不能加x锁(排他锁:写锁),即其他进程和该进程只能对 文件进行读,不能进行修改。如果该进程给该文件加上了x锁后,其他进程不能加s锁也不能加x锁,只能允许该进程对文件进行修改。
非阻塞锁,即当进程不能为文件加锁时,不是阻塞到等待队列(这样照成上下文切换开销比较大),而是继续进行其他的任务。直到该文件释放锁。
下面是测试: 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,120); print Dumper $var; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |