s///
替换操作符。参阅第五章里的“模式匹配操作符”。
scalar EXPR
这个伪函数可以用于 LIST 里,当在列表环境中计算会生成一个不同的结果的时候,强迫 EXPR 在标量环境中计算。比如:
my ($nextvar) = scalar;
避免 在做赋值之前从标准输入把所有的行都读了进来,因为给一个列表(甚至是一个 my 列表)赋值都会产生一个列表环境。(在这里例子里如果没有 scalar,那么来自 的第一行仍然会赋予 $nextvar,但是随后的行将会被读取并抛弃,因为我们赋值的目标列表只能接受一个标量数值。)
当然,简单些而且没有那么混乱的方法是不使用圆括弧,这样就把标量环境改变成了列表环境:
my $nextvar =;
因为 print 函数是一个 LIST 操作符,所以如果你想把 @ARRAY 的长度打印出来,那么你不得不说:
print "Length is ", scalar(@ARRAY), "\n";
Perl 里没有与 scalar 对应的 “list”函数,因为实际上我们从来不需要强迫在列表环境里计算。这是因为任何需要 LIST 的操作已经给他的列表参数免费提供了一个列表环境。
因为 scalar 是单目操作符,如果你不小心给 EXPR 使用了圆括弧的列表,那么这个东西的行为就象一个标量逗号表达式一样,在空环境中计算除最后一个列表元素之外的所有其他元素,然后返回在标量环境中计算的最后一个元素。你很少想要这样的东西。下面的一个语句:
print uc(scalar(&foo, $bar)), $baz;
在道义上是等效于下面两个的:
&foo; print(uc($bar), $baz);
参阅第二章获取关于逗号操作符的更多细节。参阅第六章的“原型”获取关于单目操作符更多的信息。
seek FILEHANDLE, OFFSET, WHENCE
这个函数为 FILEHANDLE 定位文件指针,就好象用于标准 I/O 的 fseek(3) 调用一样。文件里的第一个位置是在偏移量 0 处,而不是 1 处。同样,偏移量指的是字节位置,而不是行数。通常,因为行的长度是变化的,所以我们不可能不检查到该点之间的所有文件内容就能访问某一行,除非你的所有行数都已知是特定的长度,或者你已经做了一个把行数转换成字节数的索引。(同样的限制也适用于有着变长字符编码的字符位置:操作系统不知道什么是字符,它们只知道字节。)
如果你想为 sysread 或者 syswrite 定位文件,那么不要使用 seek;标准 I/O 缓冲技术会令 seek 对文件在系统位置上的作用变得不可预料而且也不能移植。应该用 sysseek。
因为 ANSI C 的规则和严格,在一些系统上,如果你在在读取和写出之间做切换,那么你必须做一次搜寻。这样做的效果就好象调用标准 I/O 库的 clearerr(3) 函数。你可以用 WHENCE 为 1(SEEK_CUR)和 OFFSET 为 0 实现这个目的而又不会移动文件位置:
seek(TEST, 0, 1);
这个函数的一个有趣的用途是允许你跟随文件的增长,比如:
for (;;) {
while () {
grok($_); # 处理当前行
}
sleep 15;
seek LOG, 0, 1; # 重置 end-of-file 错误。
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-28372-1.html
做了电商
这市场只能投机啊
就是嘛