2011-12-30 79 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 /:/, $_; 
相關問題