2011-12-30 80 views
-3

我正在用perl写一个小型服务器。有一些小问题。当客户给我一个像这样的句子“op:xxx:xxx:xxx”时,我会得到op。然后根据所做的事情做事。如果该操作是adduser等,它将起作用。 (我使用如果$ op eq“adduser”...) 但是当我得到一个“getList:xxx:xxx”并且我得到$ op = getList时,它不能像“if $ op eq”的GetList “”。我知道,这一定是我的错。但我无法找到它。 感谢大家。perl“eq”无法正常工作。我找不到我的错

use warnings; 
use strict; 

package MyPackage; 
use base qw(Net::Server); 
our %data_base; 
our %tag_base; 
sub list { 
    my %resault; 
    foreach (keys %tag_base) { 
     print STDERR $_ . "1"; 
     my @tags = split /:/, $tag_base{$_}; 
     foreach (@tags) { 
      $resault{$_} ++; 
     } 
    } 
    my @tags; 
    foreach (keys %resault) { 
     push @tags, "$_,$resault{$_}"; 
    } 
    $_ = join ";", @tags; 
    print ; 
    print STDERR ; 
} 

sub users { 
    my $topic = shift; 
    my @users; 
    foreach (keys %tag_base) { 
     push @users, $_ if $tag_base{$_} =~ /$topic/; 
    } 
    $_ = join ";", @users; 
    print ; 
} 

sub process_request { 
    my $self = shift; 
    my $person; 
    my @info; 
    while (<STDIN>) { 
     my @gets = split /:/, $_; 
     print STDERR "@gets\n"; 
     # $data_base{shift @person} = join ":", @person; 
     my $op = shift @gets; 
     $op =~ s/\s//; 
     print STDERR $op . "\n"; 
     if ( $op eq "adduser") { 
      my $user_name = shift @gets; 
      if (exists $data_base{$user_name}) { 
       print "already_exist"; 
      } else { 
       $data_base{$user_name} = join ":", @gets; 
       print "addUserSu"; 
      }    
     } elsif ($op eq "login") { 
      my $login_name = shift @gets; 
      my $login_pw = shift @gets; 
      if (defined $data_base{$login_name}) { 
       $person = $data_base{$login_name}; 
       @info = split /:/, $person; 
       $info[0] =~ s/\s+//; 
       if ($login_pw eq $info[0]) { 
        print "$person"; 
       } else { 
        print "/$info[0]/"; 
       } 
      } else { 
       print "unexist_user"; 
      } 
     } elsif ($op eq "addTag") { 
      my $tag_user = shift @gets; 
      $tag_base{$tag_user} = join ":", @gets; 
      print "addTagSu"; 
     } elsif ($op eq "getList") { 
      print STDERR "right"; 
      &list; 
     } elsif ($op eq "getUsers") { 
      &users; 
     } 
    } 
} 

MyPackage->run(port => 13800); 
+0

你是什么意思“无法通过像‘如果$运算EQ‘的GetList’’......请告诉我错误? – Nick 2011-12-30 15:04:01

+3

我不明白你想问什么。你是否收到任何错误讯息?如果没有,你会得到任何意想不到的结果?如果是这样,请给我们提供样本输入以及相应的预期和实际产出。 – 2011-12-30 15:04:49

回答

5

我可以看到两个(简单)的原因,这可能会失败:

$op =~ s/\s//; 

你只删除一个空白:第一个。如果你的意图是删除所有空白,你会想要s/\s+//g

其次:在串

随机大写字母,变量名和命令是邪恶的。 eq是大小写敏感的,所以如果$op"getlist",然后if ($op eq "getList")将是错误的。除非大写字母对你很重要,否则你可以做if (lc($op) eq "getlist")

无采样输入,预期的输出和实际输出,这不过是无非猜测更多。

此外,作为调试语句,这是没用的:

print STDERR $op . "\n"; 

,很容易混淆和忽略。例如,如果$op为空,它只会在错误日志中产生一个空行。用途:

print STDERR "OP is: '$op'\n"; 

现在,您将能够查明$op应该出现行,你会更容易看到空白围绕着它。

+0

删除空白可能是问题所在。他应该将他的警告改为'打印STDERR qq {'$ op'\ n};'看看实际发送了什么。 – gpojd 2011-12-30 15:25:44

+0

@gpojd我知道,我刚刚补充说。 = P – TLP 2011-12-30 15:27:23

1

您正在阅读的字符串无咬食他们。

当你运行你的代码:

addtag:fred:barney 

输入存储为fred => "barney\n"

当你getList,输出为:

barney 
,1; 

我怀疑客户端期望1行输出读取:

barney,1; 

所以,只要在代码中添加一个格格这里:

while (<STDIN>) { 
     chomp; 
     my @gets = split /:/, $_; 
相关问题