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

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

$lnfea代表了这样一条线:
0:0.0000002:0.0000003:0.0000004:0.0000005:0.0000006:0.0000007:0.0000009:0.0000009:0.0000009:0.00000010:0.00000011:0.00000012:0.00000013:0.00000014:0.00000014:0.00000010:0.00000010:0.00000011:0.00000012:0.00000013:0.00000014:0.00000015:0.00000016:0.005175 17:0.00000018:0.181818:0.0000002:0.0000002:0.0000002:0.0000002:0.0000002:0.0000002:0.0000002:0.0000002:0.0000002:0.2:0.0000002:0.0000002:0.0000000.2:00000025:0.00000026:0.00000027:0.00000028:0.00000029:0.00000030:0.00000031:0.00000032:0.00000033:0.00000034:0.00000035:0.00000036:0.00000037:0.00000038:0.00000039:0.00000040:0.00000041:0.00000042:0.00000043:0.055556 44:0.00000045:0.00000046:0.000000 docid=gx000-00-0000000 inc=1 prob=0.0214125
问题是if在windows上为true,而在linux上为false(fedora 11)。两个系统都使用最新的perl版本。那么这个问题的原因是什么?

最佳答案

假设$InFea是从文件中读取的,我敢打赌该文件是dos格式的。这将导致$锚阻止linux上的匹配,因为这些平台之间的行尾不同。Perl的automagic换行转换仅适用于平台本机文本文件。如果输入文件是dos格式,linux框将在行尾之前看到一个额外的回车。
最好将每个平台的输入文件转换为本机格式。如果这是不可能的,那么您应该在读取文件句柄(防止perl执行换行转换)之前将其binmode,并说明regex中的各种换行序列以及使用数据的其他任何地方。

09-19 14:42