+ -
当前位置:首页 → 问答吧 → 关于perl中的$/的困惑

关于perl中的$/的困惑

时间:2010-09-27

来源:互联网

最近看到有些程序中出现:
undef $/;
while(<>)
{
    ..............
}
或者
local $/;
while(<>)
{
    ..................
  }

想了半天也不知道是什么用途,我就知道$/相当于awk中的RS,
请高人帮忙讲解一下!

作者: li_000828   发布时间: 2010-09-27

本帖最后由 珞水的大叔 于 2010-09-27 15:06 编辑

$/  是输入记录分隔符,缺省是换行符,readline 函数, 操作符,和 chomp 函数 会使用它。
它的作用类似 awk 的 RS 变量,并且如果你把它设置为空字串,它就把一个 或者多个空白行当作一个记录终止符。
(不过空白行必须没有任何隐藏的空格或水平 制表符。)
你可以把它设置为一个多字符字串以匹配一个多字符终止符,但是你不能为 一个模式设置它—— awk 怎么着也会在某些事情上有些优点。

请注意,如果一个文件包含连续的空白行,那么把 $/ 设置为“\n\n”的含义和把它设置 为“”略有区别。把它设置为“”将把两个或者更多的连续空白行当作一个空白行。而 设置为“\n\n”意味着 Perl 将盲目地把第三个换行当作下一段的内容。

完全取消 $/ 的定义将令下一行的输入操作把剩余的文件内容当作一个标量数值一次吃进:
undef $/; # 打开全文件模式 $_ = ; # 现在整个文件在此 s/\n[ \t]+/ /g; # 删除缩进的行

如果你在 $/ 是未定义的时候使用 while( <> ) 构造来访问 ARGV 句柄,那么每次读取都 会读取下一个文件的内容:
undef $/; while( <> ) { # $_ 里有下一个文件的所有内容 ... }

尽管我们在上面使用了 undef,但是更安全的做法是用 local 解除一个 $/ 的定义:
{ local $/; $_ = ; }

如果把 $/ 设置为一个引用,该引用指向一个整数,或者一个保存着整数数值的标量, 或者一个可以转换成一个整数的标量,那么都会令 readline 和 操作符读取固定 长度的记录(其最大记录长度是引用的整数数值),而不是读取由特定字串终止的变长 记录。所以:
$/ = \32768; # 或者 \"32768" 或者 \$scalar_var_containing_32768 opoen(FILE, $myfile); $record = ;
将从 FILE 句柄里读进不超过 32,768 字节的一条记录。如果你不是从一个面向记录的 文件里读取(或者你的操作系统里没有面向记录的文件),那么你就很有可能每次读取 动作都获取一整段数据。如果一条记录比你设置的记录尺寸还要大,那么你就会分段地 获得该记录。


以上内容引用自 Perl语言编程第三版

作者: 珞水的大叔   发布时间: 2010-09-27

仔细看了下,还是有些一知半解,要是有具体的实例就好了,不过,还是谢谢帮忙!!!

作者: li_000828   发布时间: 2010-09-27

比如,我有一个文件lele.txt,内容如下:
adc
def
用如下脚本(lala.pl):
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $n = 1;
  5. undef $/;
  6. while(<>){
  7.     print "$n: $_";
  8.     $n++;
  9. }
复制代码
执行
./lala.pl lele.txt
结果是
1: adc
def

用如下脚本(lala.pl):
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $n = 1;
  5. while(<>){
  6.     print "$n: $_";
  7.     $n++;
  8. }
复制代码
执行
./lala.pl lele.txt
结果是
1: adc
2: def

作者: 珞水的大叔   发布时间: 2010-09-27

太感谢了,undef $/取消了定义,所有的内容看作成一个标量,形成一个完整的内容,而不是一个串连的内容了。

作者: li_000828   发布时间: 2010-09-27