Perl高手请进~求教

软件和网站开发以及相关技术探讨
回复
头像
xiahongze
帖子: 149
注册时间: 2010-10-16 10:03

Perl高手请进~求教

#1

帖子 xiahongze » 2011-01-02 6:54

近来在学perl,遇到个正则匹配的问题。 :em20
原文件是MS的LETOR中一个计算RANKING性能的perl script(附件中的eval-score-mslr.txt,请改成.pl)
eval-score-mslr.txt
(8.97 KiB) 已下载 43 次
其中的匹配行是(LINE209):

代码: 全选

$lnFea =~ /^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/
数据来自MS2008,样子长得像下边的句子 :em06
0 qid:15903 1:0.011571 2:0.076923 3:0.000000 4:1.000000 5:0.012383 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.994191 12:0.081240 13:0.000000 14:0.774174 15:0.994196 16:0.003958 17:0.088235 18:0.142857 19:0.250000 20:0.004048 21:0.813038 22:0.954210 23:0.868413 24:0.914573 25:0.622796 26:0.426148 27:0.204424 28:0.397757 29:0.000000 30:0.000000 31:0.000000 32:0.000000 33:0.978268 34:1.000000 35:0.686586 36:1.000000 37:0.791811 38:1.000000 39:0.887732 40:1.000000 41:0.111111 42:0.336449 43:0.000000 44:0.000545 45:0.000789 46:0.002564 #docid = GX008-66-8698208 inc = 1 prob = 0.176849
请注意,这只有一行。数据集里是很多很多行的。
我用这个script一直提示:
Error to parse test.txt at line 1:
而我直接用那个匹配的句子去写个简单的程序,又发现匹配完全正常,以下是我写的script.

代码: 全选

#!/usr/bin/perl
		my $_ = "0 qid:18219 1:0.052893 2:1.000000 3:0.750000 4:1.000000 5:0.066225 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.047634 12:1.000000 13:0.740506 14:1.000000 15:0.058539 16:0.003995 17:0.500000 18:0.400000 19:0.400000 20:0.004121 21:1.000000 22:1.000000 23:0.974510 24:1.000000 25:0.929240 26:1.000000 27:1.000000 28:0.829951 29:1.000000 30:1.000000 31:0.768123 32:1.000000 33:1.000000 34:1.000000 35:1.000000 36:1.000000 37:1.000000 38:1.000000 39:0.998377 40:1.000000 41:0.333333 42:0.434783 43:0.000000 44:0.396910 45:0.447368 46:0.966667 #docid = GX004-93-7097963 inc = 0.0428115405134536 prob = 0.860366\n";
		chomp($_);
        if ($_ =~ /^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/)
        {
            my $label = $1;
            my $qid = $2;
            my $did = $3;
            my $inc = $4;
            my $prob= $5;
			print "label is $label\nqid is $qid\ndid is $did\ninc is $inc\nprob is $prob\n";
        }
        else
        {
            print "Error to parse the line:\n$_\n";
            exit -2;
        };
结果就是:
label is 0
qid is 18219
did is GX004-93-7097963
inc is 0.0428115405134536
prob is 0.860366
吾百思不得其解,看了许多过于正则匹配的资料,也没发现什么特别的东西。
故在此发贴求教论坛中的perl高手,望不吝赐教...
:em42
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: Perl高手请进~求教

#2

帖子 ChenFengyuan » 2011-01-02 12:03

要不你加入个 print "[$lnFea]\n";在匹配前面看下吧。
你的脚本我不太会用。。。。 :em20
头像
xiahongze
帖子: 149
注册时间: 2010-10-16 10:03

Re: Perl高手请进~求教

#3

帖子 xiahongze » 2011-01-02 12:58

ChenFengyuan 写了:要不你加入个 print "[$lnFea]\n";在匹配前面看下吧。
你的脚本我不太会用。。。。 :em20
谢谢你的回答,这下边是我按你说的加入后显示出$InFea的内容:
[0 qid:18219 1:0.052893 2:1.000000 3:0.750000 4:1.000000 5:0.066225 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.047634 12:1.000000 13:0.740506 14:1.000000 15:0.058539 16:0.003995 17:0.500000 18:0.400000 19:0.400000 20:0.004121 21:1.000000 22:1.000000 23:0.974510 24:1.000000 25:0.929240 26:1.000000 27:1.000000 28:0.829951 29:1.000000 30:1.000000 31:0.768123 32:1.000000 33:1.000000 34:1.000000 35:1.000000 36:1.000000 37:1.000000 38:1.000000 39:0.998377 40:1.000000 41:0.333333 42:0.434783 43:0.000000 44:0.396910 45:0.447368 46:0.966667 #doc]d = GX004-93-7097963 inc = 0.0428115405134536 prob = 0.860366
里边有两个错误,第一是第一个符号是多出来的(“[”);第二是docid而不是doc]d.
这究竟是怎么回事啊???
前边的第198行:

代码: 全选

my $lnFea = <FIN_Feature>
意思不就是按行读取吗?
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate
头像
xiahongze
帖子: 149
注册时间: 2010-10-16 10:03

Re: Perl高手请进~求教

#4

帖子 xiahongze » 2011-01-02 14:26

应该是:

代码: 全选

print "$lnFea\n";
print出来的结果是正确的
0 qid:18219 1:0.052893 2:1.000000 3:0.750000 4:1.000000 5:0.066225 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.047634 12:1.000000 13:0.740506 14:1.000000 15:0.058539 16:0.003995 17:0.500000 18:0.400000 19:0.400000 20:0.004121 21:1.000000 22:1.000000 23:0.974510 24:1.000000 25:0.929240 26:1.000000 27:1.000000 28:0.829951 29:1.000000 30:1.000000 31:0.768123 32:1.000000 33:1.000000 34:1.000000 35:1.000000 36:1.000000 37:1.000000 38:1.000000 39:0.998377 40:1.000000 41:0.333333 42:0.434783 43:0.000000 44:0.396910 45:0.447368 46:0.966667 #docid = GX004-93-7097963 inc = 0.0428115405134536 prob = 0.860366
我更搞不懂是怎么回事了...
求高手~~~ :emb2
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate
头像
xiahongze
帖子: 149
注册时间: 2010-10-16 10:03

Re: Perl高手请进~求教

#5

帖子 xiahongze » 2011-01-02 15:07

刚刚有试了下,发现只要文件是windows line ending,就会发生这种错误。
把它改成unix line ending就好了。
一个莫名其妙的bug...
感谢关注 :em11 :em11 :em11
:em04 :em04 :em05 :em05
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: Perl高手请进~求教

#6

帖子 ChenFengyuan » 2011-01-02 23:26

我一般都用[]啥的包裹下。这样可以看出来呢
不过用YAML模块的,Dump函数更好
比如
perl -MYAML -e 'print Dump "a\rb\n"'
结果是
--- "a\rb\n"
把特殊的都打印出来,这样比较好:)

呵呵。我当时只想到了。用正则前,要匹配的和预期的不符合,就想打印下看看。
现在看来。换行符真是正则杀手呢。呵呵。
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: Perl高手请进~求教

#7

帖子 ChenFengyuan » 2011-01-02 23:28

会用irc么?
可以到#ubuntu-cn来交流阿。这样解决问题快点。
尤其是提示性的问题:)
头像
xiahongze
帖子: 149
注册时间: 2010-10-16 10:03

Re: Perl高手请进~求教

#8

帖子 xiahongze » 2011-01-03 10:55

ChenFengyuan 写了:会用irc么?
可以到#ubuntu-cn来交流阿。这样解决问题快点。
尤其是提示性的问题:)
还没用过呵呵,我去搞个哈
谢谢你~~
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate
头像
flwwater
帖子: 762
注册时间: 2010-10-31 9:15
系统: kubuntu 24.04

Re: Perl高手请进~求教

#9

帖子 flwwater » 2011-01-17 17:46

windows line ending 行的最后隐式包含‘换行符’和‘回车符’
unix只包含一个换行符
个人收藏的数百个精美动态壁纸:
https://url17.ctfile.com/d/15983117-593 ... 768?p=6220
(访问密码:6220


个人收藏的经典国语音乐和纯音乐(钢琴,笛子,二胡等):
https://url17.ctfile.com/d/15983117-446 ... 33e?p=6220
(访问密码:6220



如果访问密码不对,可试试这个密码 566816
回复