Perl正则表达式匹配多行文件与匹配变量如何处理换行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl正则表达式匹配多行文件与匹配变量如何处理换行相关的知识,希望对你有一定的参考价值。

大家好,我是Perl初学者;现在碰到一问题,如下:
use strict;
my $values ;
open(OUTFILE,"file.txt") or die("Can't find file.txt:$!") ;
while(defined($values= <OUTFILE>))
# print $values ;
if($values =~ /.*User Name:(.*);(.*)/ms)
print $1;
print $2;

我的file.txt内容为:
Logon Failure:
User Name:lixin;
Domain:BEIM-SERVER;
Reason:Unknown user name or bad password!
问题:按照我的程序匹配之后,本应$1得到的是lixin,$2得到的是后面所有的内容。
但此时$2只得到个换行,后面两行内容并未得到。

而:
use strict;
$_ = "Logon Failure:
User Name:lixin;
Domain:BEIM-SERVER;
Reason:Unknown user name or bad password" ;
if(/.*User Name:(.*);(.*)/ms)
print $1;
print $2;
这样$2却又能得到内容。
请问大家这是什么原因呢? 该怎么解决呢?万分万分感谢!
用三楼的方法,加上$/ = undef; 就可以了
谢谢大家。

$values= <OUTFILE>
这样这个变量只读取了一行啊,$/ 中保存这输入行记录分隔符(它的默认分隔符是\n)。因此,每当菱形运算符用于读取数据时,它将一直读取数据,直到它发现与$/一致的字符。所以,如果我们将$/设为 undef ,菱形运算符将读取整个文件并将它们存储在标量中。

要想让perl“吞吃文件”,可以改成这样:

use strict;
my $values ;
open(OUTFILE,"file.txt") or die("Can't find file.txt:$!") ;
$/ = undef; # 此行注掉后,$values 仅读入Logon Failure:
while(defined($values= <OUTFILE>))
# print $values ;
if($values =~ /.*User Name:(.*);(.*)/ms)
print $1;
print $2;

参考资料:http://www.diybl.com/course/4_webprogram/cgi/perl/200862/120049.html#

参考技术A 我觉得循环里面应该还有个$values=<OUTFILE>
因为 <OUTFILE>每执行一次,仅仅读取一行内容,循环第二次得到第二行内容,应该是这样我觉得
参考技术B 去这里问......
http://bbs3.chinaunix.net/forumdisplay.php?fid=25

参考资料:http://bbs3.chinaunix.net/forumdisplay.php?fid=25

以上是关于Perl正则表达式匹配多行文件与匹配变量如何处理换行的主要内容,如果未能解决你的问题,请参考以下文章

Perl 正则表达式多行匹配没有点

perl正则表达式怎么匹配多行?

perl多个正则表达式匹配多行

perl 正则表达式 模糊匹配

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

perl 之 正则表达式 (简)