Perl正则表达式问题

时间:2009-09-09 18:00:46

标签: windows regex linux perl

我在perl脚本中有这个条件:

if ($lnFea =~ m/^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/)

并且$ lnFea代表这种行:

0 qid:7968 1:0.000000 2:0.000000 3:0.000000 4:0.000000 5:0.000000 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.000000 12:0.000000 13:0.000000 14:0.000000 15 :0.000000 16:0.005175 17:0.000000 18:0.181818 19:0.000000 20:0.003106 21:0.000000 22:0.000000 23:0.000000 24:0.000000 25:0.000000 26:0.000000 27:0.000000 28:0.000000 29:0.000000 30:0.000000 31:0.000000 32:0.000000 33:0.000000 34:0.000000 35:0.000000 36:0.000000 37:0.000000 38:0.000000 39:0.000000 40:0.000000 41:0.000000 42:0.000000 43:0.055556 44:0.000000 45:0.000000 46:0.000000 #docid = GX000- 00-0000000 inc = 1 prob = 0.0214125

问题是if在Windows上是真的但在Linux上是假的(Fedora 11)。两个系统都使用最新的perl版本。那么这个问题的原因是什么?

1 个答案:

答案 0 :(得分:10)

假设从文件中读取$InFea,我打赌该文件是DOS格式。这将导致$锚点阻止Linux上的匹配,因为这些平台之间的行结尾存在差异。 Perl的自动换行转换仅适用于平台本机文本文件。如果输入文件是DOS格式,Linux框将在行尾之前看到额外的回车。

最好将输入文件转换为每个平台的本机格式。如果那是不可能的,你应该binmode文件句柄(防止Perl执行换行转换),然后再读取它,并考虑正则表达式中的各种换行序列以及使用数据的其他任何地方。