Perl的文件操作(2)(适合初学者)

原创 2002年01月04日 10:39:00

读入多个记录
如果你调用,返回文件中剩余的记录。如果你处于文件尾,则返回空表:

@records = ;

if (@records) {

print "There were ", scalar(@records), " records read.n";

}


在下面的一步中,进行赋值和测试两项工作:

if (@records = ) {

print "There were ", scalar(@records), " records read.n";

}

chomp() 也可适用对数组操作:

@records = ;

chomp(@records);

对于任何表达式,都可以进行chomp操作,故你可以在下面的一步中这样写:

chomp(@records = );


什么是记录?

记录的缺省定义为:“行”。

记录的定义由$/ 变量控制的,该变量存放所输入的记录的分隔符,因为换行符字符(根据定义!)是用来分隔行的,故其缺省值为串“n”。

例如,你可以用任何你想要替换的符号来代替“n”。

$/ = ";";

$record = ; # 读入下一个用分号分隔的记录

$/可以取其它两个有趣的值:空串("") 和undef。

读入段落
$/ =""的写法是用来指示Perl读入段落的,段落是由两个或两个以上的换行符构成的文本块。这不同于设置为"nn",后者仅读入由两行组成的文本块。在这种情况下,将出现这样一个问题:如果有连续的空行存在,例如“textnnnn”,你既可以把它解释为一个段落 ("text"),也可以解释为两个段落 ("text", 后面跟两个换行符,以及一个空段落,后面跟两个空行。)

在读入文本时,第二个解释用途不大。如果你正在读的段落出现上述情况,你不必过滤出“空”段落。

$/ = "nn";

while () {

chomp;

next unless length; # 跳过空段

# ...

}


你可以把 $/设置为undef,它用于读入后面跟着两个或多个换行符组成的段落: undef $/;

while () {

chomp;

# ...

}


读入整个文件

$/ 的其它有趣的值为undef。如果设置为该值,就将告诉Perl,读命令将把文件的剩余部分作为一个串返回:

undef $/;

$file = ;


因为改变了 $/的值,将会影响以后的每次读操作,而不仅是下一个读操作。通常,你需要将该操作限制在局部。通过下面的例子,可以把文件句柄的内容读入到一个串中:

{

local $/ = undef;

$file = ;

}


记住:Perl变量可读入很长的串。尽管你的文件大小不可以超出你的虚拟内存容量的限度,你仍可以读入尽可能多的数据。
用正则表达式对文件进行操作
一旦你有个包含了整个串的变量,你可以使用正则表达式,对整个文件进行操作,而不是对文件中的某个块进行操作。有两个有用的正则表达式标记/s和/m。一般,Perl的正则表达式对行进行处理,你可以这样写:

undef $/;

$line = ;

if ($line =~ /(b.*grass)$/) {

print "found $1n";

}


如果把我们的文件填入如下内容:
browngrass

bluegrass

则输出为:

found bluegrass

它没有找到“browngrass”,这是因为$ 仅在串尾寻找其匹配, (或者在串结束前的一行)。如果在包含很多行的串中,用"^" 和"$" 来匹配,, 我们可以使用 /m ("multiline") 选项:

if ($line =~ /(b.*grass)$/m) {}

现在程序会把如下的信息输出:

found browngrass

类似地,句点可以匹配除了换行符之外的所有字符:

while () {

if (/19(.*)$/) {

if ($1 < 20) {

$year = 2000+$1;

} else {

$year = 1900+$1;

}

}

}


如果我们从文件中读入“1981”,$_ 将包含“1981n”。正则表达式中的句点匹配“8”和“1”, 而不匹配“n”。这里正需要这样做,因为换行符不是日期的组成部分。

对于一个包含很多行的串,我们也许要提取其中的大的块,这些块可能会跨越行分隔符。在这种情况下,我们可以使用 /s 选项,并用句点来匹配除了换行符以外的所有字符。

if (m{(.*?)}s) {

print "Found bold text: $1n";

}


此处,我用了{}来表示正则表达式的起始和结束,而不用斜杠,所以,我就可以告诉 Perl我正在匹配,起始字符为"m",结束字符为"s"。你可以把/s 和/m 选项组合使用:

if (m{^(.*?)}sm) {

# ...

}

总结
有两种方法打开文件:open()函数的特点是快速简捷,而sysopen()函数功能强大而复杂。通过 操作符,可以读入一个记录,$/ 变量可以让你控制记录是什么。如果你打算把很多行的内容读入到一个串中,不要使用忘记/s和/m 这两个正则表达式标记。

Java 技术新手入门-Java 初学者的入门指南

developerWorks 在线教程是开发人员学习编程技术的最佳方式之一,它将知识与示例代码通过精心的设计很好的结合在一起,让读者通过亲自动手实践,循序渐进地体验和掌握各种编程技术与开发技能。本栏目...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年04月01日 17:36
  • 1276

perl中@_,$_和$1,$2,...及其类似变量的含义

Perl's a great language for special variables - variables that are set up without the programmer hav...
  • renyp8799
  • renyp8799
  • 2013年08月06日 09:24
  • 3476

Kaggle入门教程——机器学习和数据科学竞赛的大数据平台

Kaggle入门教程——机器学习和数据科学竞赛的大数据平台         Kaggle是由联合创始人、首席执行官安东尼·高德布卢姆(Anthony Goldbloom)2010年在墨尔本创立的,...
  • lcy7289786
  • lcy7289786
  • 2017年04月03日 15:57
  • 741

github上可供新手阅读和玩耍的java项目有哪些??

扫垃圾 ,Java 爱好者, 前沿技术思考者 刘巍然-学酥 等 217 人赞同 一个聊天程序范例: tinystruct2.0/smalltalk.java at master ·...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年07月10日 00:12
  • 4891

html入门教程适合初学者(2)

五、HTML的超链接先看两个示例建立一个超链接这个示例演示了如何在HTML文件里创建超链接。         这是一个链接          ...
  • L_Jun0112
  • L_Jun0112
  • 2017年02月21日 20:53
  • 196

Unity3D学习之(习题练习)

Unity3D学习之(习题拓展) 1、使用continue计算1+3+5+...99 ①从上述运算中可以看出,1到99之的奇数相加的和。    首先要定义一个int sum=0; ②从题意可知...
  • Baron_Ldx
  • Baron_Ldx
  • 2014年11月24日 22:43
  • 869

推荐几本适合初学者的Java书籍

学习java哪本书比较好?作为Java初学者,我想这是问的最多的问题了老,下面整理一些学习java的好书推荐给大家,希望对大家学习java有所帮助。 Java入门好书推荐:《Head First...
  • m13286282
  • m13286282
  • 2014年12月25日 15:58
  • 7693

seo实战密码好不好

一直很多人问我这个问题,不久前看到一位MM买seo实战密码,她问我读过没有,我说读过,然后她就一直向我说明seo是多么神奇的书,貌似拿着一本稀世珍宝。可怜的孩纸啊,seo实战密码我相信N多的人都读过了...
  • u013569832
  • u013569832
  • 2014年02月02日 15:42
  • 1389

[Perl系列—] 2. Perl 中的引用用法

Perl 中的引用,为什么要使用引用?对于熟悉C语言的开发者来说, 指针这个概念一定不陌生。Perl 的引用就是指针,可以指向变量、数组、哈希表甚至子程序。Perl5中的两种Perl引用类型为硬Per...
  • oscar999
  • oscar999
  • 2014年06月25日 08:45
  • 2378

Android初学者的疑惑与“死板”的Android初学之路

今天11点多的时候刷新了一下自己的博客,发现已经被CSDN授予了“博客专家”称号。作为一个自学的一年多的大二学生来讲,这对我真是莫大的鼓励,真是感谢CSDN!在此,也是分享一下自己的经历,希望能够给初...
  • Double2hao
  • Double2hao
  • 2016年06月12日 16:59
  • 3062
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Perl的文件操作(2)(适合初学者)
举报原因:
原因补充:

(最多只允许输入30个字)