Windows Perl正则表达式问题

Windows Perl正则表达式问题,windows,regex,linux,perl,Windows,Regex,Linux,Perl,我在perl脚本中有以下条件: if ($lnFea =~ m/^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/) 而$lnFea代表了这种类型的线: 0 qid:79681:0.0000002:0.0000003:0.0000004:0.0000005:0.0000006:0.0000007:0.0000008:0.0000009:0.00000010:0.00000011:0.0000001

我在perl脚本中有以下条件:

if ($lnFea =~ m/^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/)
而$lnFea代表了这种类型的线:

0 qid:79681:0.0000002:0.0000003:0.0000004:0.0000005:0.0000006:0.0000007:0.0000008:0.0000009:0.00000010:0.00000011:0.00000012:0.00000013:0.00000014:0.00000015:0.00000016:0.00517517:0.00000018:0.181818:0.00000020:0.00310621:0.00000022:0.00000023:0.00000024:0.0000000.28: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-000000 inc=1 prob=0.0214125


问题是if在Windows上为true,而在Linux上为false(Fedora11)。两个系统都使用最新的perl版本。那么这个问题的原因是什么呢?

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


对于每个平台,最好将输入文件转换为本机格式。如果这不可能,您应该在读取文件句柄(防止Perl执行换行转换)之前
binmode
filehandle,并说明正则表达式中的各种换行序列以及使用数据的任何其他地方。

+1我同意。OP要么转换行尾格式,要么在正则表达式中包含可选的CRLF序列。+1我也要这么说。如果删除正则表达式末尾的$,在这种情况下可能会起作用。或者:s/\r//g和chomp()删除任何下线字符并接受任意混合行结尾。但马克可能是对的,美元对正则表达式没有任何价值,可能会被取消。接受超集语法通常不是一个bug,正则表达式的有效性很差。最后:无需在正则表达式中转义“:”和“#”字符。谢谢大家,我在结尾删除了$并开始工作。谢谢。