现在的位置: 首页 > 综合 > 正文

perl程序被网友狠批,呵呵,爽!

2013年02月01日 ⁄ 综合 ⁄ 共 11499字 ⁄ 字号 评论关闭
发信人: jiangfei (afei), 信区: Perl
标  题: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 11:07:12 2005), 转信

我想把每个词后面的词性信息去掉(/xxx形式)词性信息中可能有各种各样非字字符
而且必须对应词性表去删除(词性表中有的词性信息才可删除)
我下面的程序先定义词性表,然后对文件中每句话匹配删除,
可是例子中的/prep$ 和/m(variable) 无法正确匹配,请指教。。

#!
#输入:
1(5:5)规则/a ->(1:1)RULES/A 
1(2:2)壶/ng ->(3:3)PLAY/NNP 
2(2:5)壶/prep$ 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/NNP PLAY/NNP 
2(1:5)冰/m(variable) 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/NNP PLAY/NNP 
#输出:
1(5:5)规则 ->(1:1)RULES 
1(2:2)壶 ->(3:3)PLAY 
2(2:5)壶 之 竞赛 规则 ->(1:3)RULES OF PLAY 
2(1:5)冰 壶 之 竞赛 规则 ->(1:3)RULES OF PLAY 

open IN ,"input.txt" or die "can not open file,$!/n ";
open RESULT, ">output.txt" or die"can not open >out.txt,$!/n";

@all = <IN>;
my @pos_table;

#初始化@pos_table
@pos_table[0] = '/a';
@pos_table[1] = "/A";
@pos_table[2] = "/prep$";
@pos_table[3] = "/m(variable)";
@pos_table[4] = "/NNP";
@pos_table[5] = "/usde";
@pos_table[6] = "/ng";
my $pos_num = 7;

for(my $count = 0; $count < @all ;$count +=1)
{
    my $str = @all[$count];
    
    #$str =~ s///[/S]+ / /g;#warning
    for(my $i = 0;$i<$pos_num;$i++)
    {
        $str =~s/$pos_table[$i]//g;
    }
    
   print RESULT $str;
  
  
}
print "warning: 如果发现结果不正确,请用记事本程序打开源程序/n查看warning句后是否正确初始化所有词性/n";
print "按任意键结束/n";
$wait = <STDIN>;

--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:rogerz] [进入讨论区] [返回顶部] 2
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 11:13:06 2005), 转信

pos_table里的特殊字符得转义吧,/,$等等

【 在 jiangfei (afei) 的大作中提到: 】
: 我想把每个词后面的词性信息去掉(/xxx形式)词性信息中可能有各种各样非字字符
: 而且必须对应词性表去删除(词性表中有的词性信息才可删除)
: 我下面的程序先定义词性表,然后对文件中每句话匹配删除,
: ...................

--
                                                                                
  ╭───────────────┬──今夏的亮点                              
  ├☆  十年岁月        ≮ ~~~ ≯ ╰╮                                          
  ├☆  辉煌水木                    ╰╮        十年水木纪念站衫                
  ├★  我们的bbs                     │                                        
  ├★  我们自己创造         @@       │                欢迎访问T_shirt          

※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 3
发信人: jiangfei (afei), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 11:26:24 2005), 转信

我转义试过了也不好时的
【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】
: pos_table里的特殊字符得转义吧,/,$等等

--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:rogerz] [进入讨论区] [返回顶部] 4
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 12:20:19 2005), 转信

()和$也要转义的,直接用quotemeta?

#!/usr/bin/perl -w
use strict;
my @pos_table=qw(/a /A /prep$ /m(variable) /NNP /usde /ng);
my $rule;
{
    local $/='';
    $rule=<>;
}
for my $pos(@pos_table){
    $pos=quotemeta($pos);
    $rule =~ s/$pos(?= |/n|$)//gs;
}
print $rule;

【 在 jiangfei (afei) 的大作中提到: 】
: 我转义试过了也不好时的

--
                                                                                
  ╭───────────────┬──今夏的亮点                              
  ├☆  十年岁月        ≮ ~~~ ≯ ╰╮                                          
  ├☆  辉煌水木                    ╰╮        十年水木纪念站衫                
  ├★  我们的bbs                     │                                        
  ├★  我们自己创造         @@       │                欢迎访问T_shirt          

※ 修改:·rogerz 于 Jun 26 12:20:56 修改本文·[FROM: 211.151.90.*]
※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 5
发信人: jiangfei (afei), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 12:24:53 2005), 转信

非常感谢
!我现在试试
【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】
: ()和$也要转义的,直接用quotemeta?
: #!/usr/bin/perl -w
: use strict;
: ...................

--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 6
发信人: jiangfei (afei), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 12:35:31 2005), 转信

sigh!
还是不work!
hehe
【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】
: ()和$也要转义的,直接用quotemeta?
: #!/usr/bin/perl -w
: use strict;
: ...................

--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:rogerz] [进入讨论区] [返回顶部] 7
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 12:38:11 2005), 转信

??,我这里没什么问题啊

~ $ perl tt.pl input.txt

1(5:5)规则 ->(1:1)RULES
1(2:2)壶 ->(3:3)PLAY
2(2:5)壶 之 竞赛 规则 ->(1:3)RULES OF PLAY
2(1:5)冰 壶 之 竞赛 规则 ->(1:3)RULES OF PLAY

【 在 jiangfei (afei) 的大作中提到: 】
: sigh!
: 还是不work!
: hehe
: ...................

--
                                                                                
  ╭───────────────┬──今夏的亮点                              
  ├☆  十年岁月        ≮ ~~~ ≯ ╰╮                                          
  ├☆  辉煌水木                    ╰╮        十年水木纪念站衫                
  ├★  我们的bbs                     │                                        
  ├★  我们自己创造         @@       │                欢迎访问T_shirt          

※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 8
发信人: jiangfei (afei), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 12:45:46 2005), 转信

帅气!
好使极了!
谢谢!
如何把输出文件也设为命令行输入形式呢?
俺这几句看不懂,羞....
my $rule;
{
    local $/='';
    $rule=<>;
}

【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】
: ??,我这里没什么问题啊
: ~ $ perl tt.pl input.txt
: 1(5:5)规则 ->(1:1)RULES
: ...................

--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:GunFactory] [进入讨论区] [返回顶部] 9
发信人: GunFactory (Arsenal), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 12:51:58 2005), 转信

读出整个文件阿
看看$/什么意思
【 在 jiangfei (afei) 的大作中提到: 】
帅气!
好使极了!
谢谢!
如何把输出文件也设为命令行输入形式呢?
俺这几句看不懂,羞....
my $rule;
{
    local $/='';
    $rule=<>;
}

【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】
: ??,我这里没什么问题啊
: ~ $ perl tt.pl input.txt
: 1(5:5)规则 ->(1:1)RULES
: ...................

--

--

※ 来源:·水木社区 newsmth.net·[FROM: 61.167.60.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:rogerz] [进入讨论区] [返回顶部] 10
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 12:53:50 2005), 转信

【 在 jiangfei (afei) 的大作中提到: 】
: 帅气!
: 好使极了!
: 谢谢!
: 如何把输出文件也设为命令行输入形式呢?
: 俺这几句看不懂,羞....
: my $rule;
: {
:     local $/='';
perldoc perlvar

默认$/是/n,所以标量环境下只读入一行,undef之后就一次性读入文件全部内容了

命令行参数用@_访问
比如tt.pl input.txt output.txt
那么
($in,$out)=@_;

:     $rule=<>;
: }

--
                                                                                
  ╭───────────────┬──今夏的亮点                              
  ├☆  十年岁月        ≮ ~~~ ≯ ╰╮                                          
  ├☆  辉煌水木                    ╰╮        十年水木纪念站衫                
  ├★  我们的bbs                     │                                        
  ├★  我们自己创造         @@       │                欢迎访问T_shirt          

※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 11
发信人: jiangfei (afei), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 12:57:16 2005), 转信

但是,我把核心部分放在我程序中,却不好使,怪啊!
因为文件太大,所以不可能一次把文件读到一个量中
要一行一行处理,又应该如何改写呢?

#!/usr/bin/perl -w
#输入:
#1(5:5)规则/ng ->(1:1)RULES/NNP 
#1(2:2)壶/ng ->(3:3)PLAY/NNP 
#2(2:5)壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP 
#2(1:5)冰/ng 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP 
#输出:
#1(5:5)规则 ->(1:1)RULES 
#1(2:2)壶/ng ->(3:3)PLAY 
#2(2:5)壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP 
#2(1:5)冰/ng 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP 
use strict;
open IN ,"input.txt" or die "can not open file,$!/n ";
open RESULT, ">output.txt" or die"can not open >out.txt,$!/n";

my @all = <IN>;
my @pos_table=qw(/a /A /prep$ /m(variable) /NNP /usde /ng);
print join("/n",@pos_table);

for(my $count = 0; $count < @all ;$count +=1)
{
    my $str = @all[$count];
    
    for my $pos(@pos_table){
    $pos=quotemeta($pos);
    $str =~ s/$pos(?= |/n|$)//gs;
   }
    print RESULT $str;
  
  
}
print "warning: 如果发现结果不正确,请用记事本程序打开源程序/n查看warning句后是否正确初始化所有词性/n";
print "按任意键结束/n";
my $wait = <STDIN>;

【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】
: perldoc perlvar
: 默认$/是/n,所以标量环境下只读入一行,undef之后就一次性读入文件全部内容了
: 命令行参数用@_访问
: ...................

--

※ 修改:·jiangfei 於 Jun 26 12:59:49 2005 修改本文·[FROM: 61.167.60.*]
※ 修改:·jiangfei 於 Jun 26 13:03:04 2005 修改本文·[FROM: 61.167.60.*]
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:rogerz] [进入讨论区] [返回顶部] 12
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 13:02:25 2005), 转信

: my @all = <IN>;
: my @pos_table=qw(/a /A /prep$ /m(variable) /NNP /usde /ng);
: print join("/n",@pos_table);
: for(my $count = 0; $count < @all ;$count +=1)
: {
:     my $str = @all[$count];
这个肯定错了,应该是$all[$count];
ps:
  我觉得你写的程序更像c语言……
:     for my $pos(@pos_table){
:     $pos=quotemeta($pos);
:     $str =~ s/$pos(?= |/n|$)//gs;
:    }
:     print RESULT $str;
: }
: print "warning: 如果发现结果不正确,请用记事本程序打开源程序/n查看warning句后是否正确初始化所有词性/n";
: print "按任意键结束/n";
: my $wait = <STDIN>;

--
                                                                                
  ╭───────────────┬──今夏的亮点                              
  ├☆  十年岁月        ≮ ~~~ ≯ ╰╮                                          
  ├☆  辉煌水木                    ╰╮        十年水木纪念站衫                
  ├★  我们的bbs                     │                                        
  ├★  我们自己创造         @@       │                欢迎访问T_shirt          

※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:Andor] [进入讨论区] [返回顶部] 13
发信人: Andor (柠檬汁), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 13:47:05 2005), 转信

【 在 jiangfei (afei) 的大作中提到: 】
: 但是,我把核心部分放在我程序中,却不好使,怪啊!
: 因为文件太大,所以不可能一次把文件读到一个量中
: 要一行一行处理,又应该如何改写呢?
: #!/usr/bin/perl -w
: #输入:
: #1(5:5)规则/ng ->(1:1)RULES/NNP 
: #1(2:2)壶/ng ->(3:3)PLAY/NNP 
: #2(2:5)壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP 
: #2(1:5)冰/ng 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP 
: #输出:
: #1(5:5)规则 ->(1:1)RULES 
: #1(2:2)壶/ng ->(3:3)PLAY 
: #2(2:5)壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP 
: #2(1:5)冰/ng 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP 
: use strict;
: open IN ,"input.txt" or die "can not open file,$!/n ";
: open RESULT, ">output.txt" or die"can not open >out.txt,$!/n";
: my @all = <IN>;
close(IN);
不过不加也没什么影响。
: my @pos_table=qw(/a /A /prep$ /m(variable) /NNP /usde /ng);
my @pos_table = map(quotemeta, qw(/a /A /prep$ /m(variable) /NNP /usde /ng));
# 建议命名为 @quoted_pos_table 或 @regex_pos_table :)
: print join("/n",@pos_table);
调试还应该每次用的时候检查一下,看看有没有被改变什么的,
不能光检查一下初值就了事啊 ^_^
: for(my $count = 0; $count < @all ;$count +=1)
: {
:     my $str = @all[$count];
my $str = $all[$count];
虽然不改也能得到同样结果,但是逻辑上有语义错误。

然后,以上两句(从for开始),以perl的风格,建议写成:
foreach my $str (@all)
{
:     for my $pos(@pos_table){
:     $pos=quotemeta($pos);
去掉上面这行。
修改$pos会影响@pos_table本身,虽然在只用一次时不影响结果,
但这个语义错误在多次使用时会导致结果不是你预期的。
:     $str =~ s/$pos(?= |/n|$)//gs;
这里不需要s参数,不过加了也没影响。
另外循环体应该缩进。
:    }
:     print RESULT $str;
: }
close(RESULT);
不关闭输入文件也罢了,不关闭输出文件就…… ;)
: print "warning: 如果发现结果不正确,请用记事本程序打开源程序/n查看warning句后是否正确初始化所有词性/n";
: print "按任意键结束/n";
: my $wait = <STDIN>;
这里直接写<STDIN>;就行,另外前面一行提示应该是“回车键”而不是“任意键”吧?

--
※ 修改:·Andor 于 Jun 26 13:55:44 修改本文·[FROM: 143.89.144.*]
※ 来源:·水木社区 newsmth.net·[FROM: 143.89.144.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:Andor] [进入讨论区] [返回顶部] 14
发信人: Andor (柠檬汁), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 13:50:11 2005), 转信

【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】
: 这个肯定错了,应该是$all[$count];
: ps:
:   我觉得你写的程序更像c语言……
呵呵,我觉得也不太像C。
C的话那里不会用“+= 1”,也不会加“my $wait =”……

--

※ 来源:·水木社区 newsmth.net·[FROM: 143.89.144.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 15
发信人: jiangfei (afei), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 15:09:15 2005), 转信

以前一直这样用,呵呵!
痛改前非!
【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】
: 这个肯定错了,应该是$all[$count];
: ps:
:   我觉得你写的程序更像c语言……

--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]

 

[本篇全文] [回复文章] [回信给作者] [本篇作者:jiangfei] [进入讨论区] [返回顶部] 16
发信人: jiangfei (afei), 信区: Perl
标  题: Re: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 15:10:05 2005), 转信

看了Andor的回帖,我觉得真是痛快!
呵呵,谢谢指教。
【 在 Andor (柠檬汁) 的大作中提到: 】
: close(IN);
: 不过不加也没什么影响。
: my @pos_table = map(quotemeta, qw(/a /A /prep$ /m(variable) /NNP /usde /ng));
: ...................

--

抱歉!评论已关闭.